Точно, поскольку в предыдущем ответе Maciek говорится:
На самом деле это не ищет нигде. Это ожидает входа от стандартного входа.
Однако можно записать в stdin уже запускающей программы, если Вы имеете/proc в наличии путем передачи по каналу данных в, он - 0th первый дескриптор:
В одном выполненном терминале
grep "hello"
и посмотрите, что он ожидает неограниченно долго... В другом терминальном типе это:
echo "hello $USER" > /proc/`pgrep grep`/fd/0
посмотрите первую терминальную печать привет и Ваше имя пользователя.
Неупомянутая переменная (как в $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='
'
Заключенная в кавычки новая строка является новой строкой. Так echo "$1"
дает единственный параметр командной строки для повторения, который затем печатает новые строки непосредственно.
Неупомянутая новая строка является пробелом. Так echo $1
дает много параметров командной строки для повторения, который печатает их один за другим разделенный с пробелами.