Intereting Posts

Поведение stdin / stdout в сочетании с подоболочками и командой cd

У меня есть следующая команда:

cd / && ls | ( cd /tmp && cat >dumpfile) 

Эта серия команд делает следующее: он создает файл с именем /tmp/dumpfile . Этот файл содержит список корневого каталога.

Выход cd / && ls передается по трубопроводу на подоболочку. То, что я нахожу странным, заключается в том, что в подоболочке вместо cd /tmp проглатывающей вывод ls , более поздний cat >dumpfile получает его и записывает в файл. Что здесь происходит?

Труба устанавливает stdout, чтобы перейти от ls к подоболочке.

В подоболочке cd /tmp и cat выполняются в одном и том же процессе.

cd /tmp не читается из stdin (pipe), поэтому, когда cat читает из stdin, он получает весь вывод ls .

cd не проглатывает вывод, потому что он не хочет. Учти это:

 { ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile) 

Только последний cat >dumpfile сохранит stdin исходящий из этого канала, потому что ни одна из других команд не хочет его использовать.