Почему glob = '*';echo "$ glob" записать только '*', а не список файлов? - PullRequest
0 голосов
/ 01 июля 2019

У меня вопрос по поводу оболочки и сбоев.

Когда я делаю что-то вроде:

myglob=*
echo $myglob

Я получаю список файлов каталога, так что все в порядке

Но когда я делаю:

myglob=*
echo "$myglob"
*

, я получаю * вместо файлов в каталоге.Что я не понимаю, оболочка не передает * команду echo?

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Разве оболочка не передает * команду echo?

Да, в этом проблема.

echo просто записывает то, что вы передаете.Если вы передадите ей *, она всегда будет просто записывать *.

Когда вы делаете

myglob=*
echo $myglob

Bash не передает *.

Вместо этого bash сначала расширяет глобус и по существу переписывает команду в echo file1 file2 file3 file4....Неудивительно, что echo затем пишет file1 file2 file3 file4....

1 голос
/ 02 июля 2019

не передает ли оболочка * команде echo?

Да, когда она заключена в кавычки.Расширение имени файла, globbing , выполняется оболочкой во время сканирования строки (не командой echo), но не тогда, когда шаблон находится внутри кавычек.

set -x (xtrace) является вашим другом, это показывает расширения и когда они происходят (ведущий + - это приглашение xtrace, PS4):

set -x
myglob=*
echo $myglob

Дает:

+ myglob='*'
+ echo ... filenames in the current directory ...

Вы можете видеть, что расширение * выполняется до вызова echo.

Принимая во внимание:

set -x
myglob=*
echo "$myglob"

Дает:

+ myglob='*'
+ echo '*'
*

Здесь вы можете видеть, что расширения нет, и это одна из причин (есть и другие) использования кавычек.

set +x отключит функцию xtrace.

1 голос
/ 01 июля 2019

С страница руководства bash в двойных кавычках :

Заключение символов в двойные кавычки ('' ') сохраняет буквальное значение всех символов в кавычках, за исключением' $ ',' `',' \ 'и, когда расширение истории включено,'! ».


Вторая команда оценивается как:

echo "*"

который, по ссылке, не расширяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...