У меня есть файл requirements.txt
, содержащий зависимости для будущей установки.
У файла просто одно имя в каждой строке:
$cat requirements.txt
pandas
numpy
...
Некоторая часть моего фактического кода выглядит так:
packages=$(cat "requirements.txt") || exit
Когда я выполняю echo $ packages
вместо «$ packages»
, Я получаю следующий результат
echo $packages
pandas numpy ...
VS
echo "$packages"
pandas
numpy
...
Мне трудно понять, как на самом деле происходит разделение. Мне кажется, что версия без кавычек не разделяет строку, а двойные кавычки делают что-то странное и выводят результат построчно, хотя они должны предотвращать разбиение (то есть я ожидал, что результатом будет одна строка) Я упустил здесь что-то очевидное?
Переменная packages
включает в себя несколько строк, разделенных символами новой строки — когда вы повторяете раскрытие в кавычках, это именно то, что вы видите, поскольку вся многострочная строка передается как один аргумент в команда эхо
.
Когда вы повторяете расширение без кавычек, оно подвергается разбиению на слова (и расширению подстановки — хотя это здесь не имеет значения, поскольку ваш ввод не содержит подстановочных символов). Разделение слов основано на значении переменной IFS
, которая по умолчанию состоит из пробела, табуляции и новой строки. Каждый токен с разделителями IFS
передается в качестве отдельного аргумента в echo
, который выводит каждый из них по очереди, разделенный одним пробелом.
Дополнительная литература: