Почему «echo $(cat /path/to/fileName)» выводит список моих файлов и указаний?

Почему «echo $(cat /path/to/fileName)» выводит список моих файлов и указаний?

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

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

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

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

решение1

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

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

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

  1. Расширение тильды (см. Расширение тильды), расширение параметра (см. Расширение параметра), подстановка команды (см. Подстановка команды) и арифметическое расширение (см. Арифметическое расширение) должны быть выполнены, от начала до конца. См. пункт 5 в Распознавании токенов.

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

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

  4. Удаление цитаты (см. Удаление цитаты) всегда должно выполняться в последнюю очередь.

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

echo "$(cat /path/to/fileName)"

решение2

Цитата:

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

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

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

Связанный контент