Я работаю над обработкой текста к предоставлению ответа для вопроса пользователя на 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
Затем каждый *
в моем файле вызывают для списка моих файлов и папок. Затем, как я предотвращаю его?
Поскольку после работающей замены команды, оболочка выполняет разделение слова (или полевое разделение) на результате, если Вы не заключаете им в кавычки.
POSIX определил расширение слова как:
порядок расширения слова должен быть следующие:
расширение Тильды (см. Расширение Тильды), расширение параметра (см. Расширение Параметра), управляйте заменой (см. Замену Команды), и арифметическое расширение (см. Арифметическое Расширение), буду выполнен, начиная заканчиваться. Посмотрите объект 5 в Маркерном Распознавании.
Полевое разделение (см., что Поле Разделяет), должно быть выполнено на частях полей, сгенерированных шагом 1, если IFS не будет пустая .
расширение Пути (см. Расширение Пути) должно быть выполнено, если не установлено-f в действительности.
удаление Кавычки (см. Удаление Кавычки) должно всегда выполняться в последний раз.
В Вашем случае, *
соответствовал всей вещи в текущем рабочем каталоге. Необходимо заключить результат в кавычки получить ожидаемый вывод:
echo "$(cat /path/to/fileName)"
Заключите его в кавычки:
$ 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
) или заключаете его в кавычки/выходите: "*" \*
. Для вывода команды всегда лучше использовать заключение в кавычки.