Почему '$ эха (кошка/path/to/fileName)' перечисляют мои файлы и папки?

Я работаю над обработкой текста к предоставлению ответа для вопроса пользователя на Au. Когда я хочу попробовать распечатку содержание файла echo $(cat /path/to/filename), это перечисляет мои файлы и папки также. Но когда я пробую printf "$(cat /path/to/filename)\n" это работает хорошо.

Я пытался также сохранить его в переменную content='cat /path/to/filename' (также content=$(cat /path/to/filename) и затем печать echo $content, но я получающий тот же неправильный результат (перечисляют файлы и папки).

Я хочу сохранить содержание файла в переменную и передать переменную в мой сценарий как вход для следующего управления.

Обратите внимание, что содержание моего файла имеет * символ в нем.

Посмотрите примеры:

kasiya@kasiya-pc:~$ cat ~/test
*Hello World!*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
*Hello World!*
------------------------------------------------------------------------------------------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*
Hello World!*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos Hello World!*
------------------------------------------------------------------------^^^^^^^^^^^^^------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*Hello World!
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
*Hello World! Desktop Documents Downloads Music Pictures Public Templates test Videos
^^^^^^^^^^^^^-----------------------------------------------------------------------------------------------------------------------------------------------
kasiya@kasiya-pc:~$ cat ~/test
*
Hello World!
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos Hello World! Desktop Documents Downloads Music Pictures Public Templates test Videos
------------------------------------------------------------------------^^^^^^^^^^^^------------------------------------------------------------------------

Фантастика

kasiya@kasiya-pc:~$ cat ~/test
*
kasiya@kasiya-pc:~$ echo $(cat ~/test)
Desktop Documents Downloads Music Pictures Public Templates test Videos

Затем каждый * в моем файле вызывают для списка моих файлов и папок. Затем, как я предотвращаю его?

1
задан 7 October 2014 в 13:36

2 ответа

Поскольку после работающей замены команды, оболочка выполняет разделение слова (или полевое разделение) на результате, если Вы не заключаете им в кавычки.

POSIX определил расширение слова как:

порядок расширения слова должен быть следующие:

  1. расширение Тильды (см. Расширение Тильды), расширение параметра (см. Расширение Параметра), управляйте заменой (см. Замену Команды), и арифметическое расширение (см. Арифметическое Расширение), буду выполнен, начиная заканчиваться. Посмотрите объект 5 в Маркерном Распознавании.

  2. Полевое разделение (см., что Поле Разделяет), должно быть выполнено на частях полей, сгенерированных шагом 1, если IFS не будет пустая .

  3. расширение Пути (см. Расширение Пути) должно быть выполнено, если не установлено-f в действительности.

  4. удаление Кавычки (см. Удаление Кавычки) должно всегда выполняться в последний раз.

В Вашем случае, * соответствовал всей вещи в текущем рабочем каталоге. Необходимо заключить результат в кавычки получить ожидаемый вывод:

echo "$(cat /path/to/fileName)"
6
ответ дан 10 November 2019 в 18:05

Заключите его в кавычки:

$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*

Как первое правило, всегда заключайте замену команды в кавычки.

пустое * будет расширено в bash, если Вы не выключите globbing (set -f или setopt noglob) или заключаете его в кавычки/выходите: "*" \*. Для вывода команды всегда лучше использовать заключение в кавычки.

2
ответ дан 10 November 2019 в 18:05

Другие вопросы по тегам:

Похожие вопросы: