1

В чем разница между echo $(pwd) и echo "$(pwd)"?

Я помню, что это одно и то же, но две команды дают мне разные результаты.

Вот мой вывод:

/usr/share/locale ⌚ 21:19:24
$ echo $(pwd)
 usr shar  l cal 

/usr/share/locale ⌚ 21:19:32
$ echo "$(pwd)"
/usr/share/locale

Кажется, что многие символы отбрасываются с помощью echo $(pwd) , поэтому многие сценарии не могут быть запущены правильно. Например, я должен использовать eval "$(something --alias)" вместо eval $(something --alias) .

Я попытался echo $(pwd) и echo "$(pwd)" в контейнере Docker, выходные данные одинаковы.

Что-то не так в моей системе?

1 ответ1

3

Все дело в разделении слов, есть переменная с именем IFS: внутренний разделитель полей, после расширения или замены bash разделит результаты этого процесса на разные слова в зависимости от значения IFS.

Значение по умолчанию для этой переменной: "<space><tab><newline>" , означает, что слова, разделенные пробелом или символом табуляции или новой строки, будут рассматриваться и передаваться как отдельные слова вашей команде.

Таким образом, переменная со значением "hello name is foo" после раскрытия будет рассматриваться как 4 разных слова:

$ printf "%s\n" hello name is foo
hello
name
is
foo

Если я хочу рассмотреть это как одно слово, я должен процитировать это:

$ printf "%s\n" "hello name is foo"
hello name is foo

Если я установлю IFS на / он будет использовать / качестве разделителя полей, поэтому:

$ export IFS='/'
$ var=/some/thing/here
$ echo $var
 some thing here

Это может быть ваш случай (с / в IFS), однако, если вы заключите в кавычки подобное: "$( ... )" тогда bash пропустит разделение слов.

затем попробуйте запустить ваши команды снова, теперь он не должен использовать / для разделения слов, в том числе и в пути (pwd).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .