Заключенный в кавычки по сравнению с неупомянутым строковым расширением

Точно, поскольку в предыдущем ответе Maciek говорится:

На самом деле это не ищет нигде. Это ожидает входа от стандартного входа.

Однако можно записать в stdin уже запускающей программы, если Вы имеете/proc в наличии путем передачи по каналу данных в, он - 0th первый дескриптор:

В одном выполненном терминале

grep "hello"

и посмотрите, что он ожидает неограниченно долго... В другом терминальном типе это:

echo "hello $USER" > /proc/`pgrep grep`/fd/0

посмотрите первую терминальную печать привет и Ваше имя пользователя.

11
11.06.2013, 01:48
2 ответа

Неупомянутая переменная (как в $var) или замена команды (как в $(cmd) или `cmd`) split+glob оператор в подобных Границе оболочках.

Таким образом, их содержание разделяется согласно текущему значению $IFS специальная переменная (который по умолчанию содержит пространство, символы табуляции и символы новой строки),

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

Таким образом в for i in $(xrandr), $(xrandr), потому что это не в кавычках, разделяется на последовательностях пространства, символов табуляции и символов новой строки. И каждое слово, получающееся из того разделения, проверено на соответствие именам файлов (или оставлено, как то, если они не соответствуют никакому файлу), и for циклы по ним всем.

В for i in "$(xrandr)", мы не используем split+glob оператор, поскольку замена команды заключается в кавычки, таким образом, существует одна передача в цикле на одном значении: вывод xrandr (без запаздывающих символов новой строки, которые управляют полосами замены).

Однако в echo $i, $i закрывается кавычки снова, поэтому снова содержание $i разделяется и подвергается поколению имени файла, и они передаются как отдельные аргументы echo команда (и echo производит его аргументы, разделенные пробелами).

Так извлеченный урок:

  • если Вы не хотите разделение слова или поколение имени файла, всегда заключайте переменные расширения в кавычки и управляйте заменами
  • если Вы действительно хотите разделение слова или поколение имени файла, оставляете их, закрыл кавычки, но установил $IFS соответственно и/или включите или отключите поколение имени файла в случае необходимости (set -f, set +f).

Как правило, в Вашем примере выше, если Вы хотите циклично выполниться по пробелу, разделил список слов в выводе xrandr, Вы должны были бы:

  • отпуск $IFS в его значении по умолчанию (или сброс это) для разделения на пробелах
  • Использовать set -f отключить поколение имени файла, если Вы не уверены это xrandr никогда выводы любой * или ? или [ символы (которые являются подстановочными знаками, используемыми в шаблонах поколения имени файла),

И затем только используйте split+glob оператор (только замена команды отпуска или переменное расширение закрыли кавычки) в in часть for цикл:

set -f; unset -v IFS
for i in $(xrandr); do whatever with "$i"; done

Если Вы хотите циклично выполниться по (непустым) строкам xrandr вывод, необходимо было бы установить $IFS к символу новой строки:

IFS='
'
19
27.01.2020, 19:57

Заключенная в кавычки новая строка является новой строкой. Так echo "$1" дает единственный параметр командной строки для повторения, который затем печатает новые строки непосредственно.

Неупомянутая новая строка является пробелом. Так echo $1 дает много параметров командной строки для повторения, который печатает их один за другим разделенный с пробелами.

4
27.01.2020, 19:57
  • 1
    Неупомянутая новая строка является пробелом, немного слишком много ярлыка, чтобы быть действительно полезным как объяснение поведения здесь IMO. –  Stéphane Chazelas 10.06.2013, 23:43

Теги

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