Небольшой вопрос об экспорте и двойных кавычках $ () - PullRequest
0 голосов
/ 01 ноября 2018

Когда я пишу export X="test" в файл test.sh и выполняю $(cat test.sh) в кавычках оболочки, то есть echo $X дает "test", тогда как export X="test" непосредственно в оболочке приводит к исчезновению кавычек, т.е. echo $X дает test почему?

Кажется, я выполняю тот же код, и он путается с моими путями:)

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Учитывая файл test.sh, который содержит фразу export X="test", команда cat test.sh выводит строку с экранированными двойными кавычками export X=\"test\", которая оценивается при выводе на консоль bash как export X="test".

Именно поэтому у меня сложилось впечатление, что я выполнил тот же код, однако в первом случае я воздействовал от \"test\" до X, а во втором - на test.

Решение, которое я впервые использовал, а затем увидел в другом месте, состоит в том, чтобы передать выходные данные от cat до sed 's/"//g', обратите внимание на одинарные кавычки ' вместо двойных кавычек ".

Спасибо Хендрику Принсло за ссылку выше.

0 голосов
/ 01 ноября 2018

Разница между ними заключается в удалении цитаты. Со страницы руководства,

Цитата Удаление

После предыдущих расширений, все вхождения без кавычек символов \, 'и', которые не были результатом одно из вышеперечисленных расширений удалено.

В $(cat test.sh) конечная команда содержит символы " без кавычек, полученные в результате подстановки команды. Подстановка команды произвела export X="test", которая разбивается на командное слово export и его буквальный аргумент X="test".

В export X="test" команда снова export с аргументом X="test", , но эти кавычки не заключены в кавычки и не были созданы никакими расширениями, поэтому они удаляются. В результате команда export получает X=test (не X="test") в качестве аргумента.

Каждая команда export затем разделяет свой аргумент на =, видя X в качестве определяемой переменной. Один видит правую часть test для использования в качестве значения, другой видит "test" для использования в качестве значения, что приводит к различным присваиваниям, которые вы наблюдали.

...