Точнее, почему
"`command "$variable"`"
обрабатывать внешние кавычки как заключающие в себя внутренние кавычки, вместо того, чтобы расширять переменную вне каких-либо кавычек?
Точная команда, которую я использовал для проверки, похожа на пример, поднятый в другом вопросе stackoverflow о правильном методе цитирования при использовании подстановки команд:
fileName="some path with/spaces"
echo "`dirname "$fileName"`"
который правильно повторяет «какой-то путь с», вместо того, чтобы жаловаться из-за недопустимого количества аргументов.
Я прочитал справочную страницу Bash, где в главе «РАСШИРЕНИЕ» в разделе «Подстановка команд» говорится, что замена $() в новом стиле сохраняет значение любого символа между скобками, однако, что касается обратных кавычек, в нем только упоминается, что обратная косая черта работает ограниченным образом:
Когда используется форма замены обратной кавычки в старом стиле, обратная косая черта сохраняет свое буквальное значение, за исключением случаев, когда за ним следует
$
,`
или\
. Первая обратная кавычка, которой не предшествует обратная косая черта, завершает подстановку команды.
Моя первая мысль заключалась в том, что обратные кавычки делают то же самое, за исключением упомянутого исключения, таким образом «цитируя» внутренние двойные кавычки, однако мне сказали, что это не так. Второе наблюдение, которое указало мне на это направление, заключалось в том, что
a=\$b
b=hello
echo `echo $a`
печатает "$b". Если бы обратные кавычки позволяли интерпретировать знак доллара, первая подстановка переменных должна была произойти до вызова подоболочки, при этом подоболочка расширяла строку «$b», что приводило к «привет». Согласно приведенной выше выдержке из справочной страницы, я даже могу убедиться, что знак доллара действительно заключен в кавычки, используя
echo `echo \$a`
и результаты все равно будут такими же.
Третье наблюдение вызывает у меня некоторые сомнения:
echo `echo \\a`
Результат: "\а"
echo \a
Результат: а
Здесь кажется, что обе обратные косые черты были сохранены до тех пор, пока подоболочка не вступила в игру, хотя страница руководства утверждает, что обратные косые черты в обратных кавычках не имеют своего буквального значения, когда за ними следует другая обратная косая черта. РЕДАКТИРОВАТЬ: ^ В этом отношении все работает так, как ожидалось, я, должно быть, использовал неправильную оболочку (tcsh в моем другом терминале и с другим символом, отличным от «a»).
Хотя мне не удалось узнать, что на самом деле происходит, пока я искал ответ, я наткнулся на некоторых людей, упоминающих термин «цитирование контекста» в отношении подстановки команд, но без каких-либо объяснений того, что это означает и где это описано. Я не нашел никаких реальных ссылок на «контексты цитирования» ни в ссылках Bash (gnu.org, tldp, man bash), ни через DuckDuckGo.
Вдобавок к знанию того, что происходит, я бы предпочел получить некоторую ссылку или руководство относительно того, как это поведение можно отличить от него, потому что я думаю, что, возможно, мне не удалось собрать воедино некоторые части, из которых это происходит естественным образом. Иначе я просто забуду ответ.
Тем, кто рекомендует людям использовать знак доллара в новом стиле и замену скобок: ок. Машины Unix 50-летней давности с десятками или сотнями различных проприетарных сред (нельзя выбросить оболочку для более новой), когда нужно писать сценарии, совместимые между большинством оболочек, которые кто-либо может использовать, это не вариант.
Спасибо всем, кто может мне помочь.