2015-09-21 4 views

ответ

3

Если коту не присвоен аргумент имени файла, он принимает данные от STDIN и отправляет его в STDOUT, поэтому эффект первой части цепочки команд заключается в том, чтобы набрать все, что было напечатано (до EOD), в файл outout .txt:

cat > outout.txt 

Если все идет нормально, то эта команда не производит никакого вывода, и поэтому вторая часть командной цепи не получает ничего, чтобы положить в outout2.txt:

cat > outout2.txt 

так файл outout2 .txt заполняется полной цепочкой команд:

$ cat > outout.txt | cat > outout2.txt 

Однако следует отметить, что outout2.txt будет получить выход, если первый «кот» вызов генерирует выходной сигнал. Например, если outout.txt не может быть изменен, и мы посылаем вывод STDERR в STDOUT:

$ chmod a-w outout.txt 
$ cat 2>&1 > outout.txt | cat > outout2.txt 

тогда outout.txt будет пустым, но следующий текст будет записан в outout2.txt (точный текст из сообщение может зависеть от вашей оболочки - я использую bash 3.2):

-bash: outout.txt: Permission denied 
+1

Технически это не первый «котик», генерирующий сообщение об ошибке, это подоболочка, созданная каналом, который выполняет «cat». Как только оболочка не откроет 'outout.txt', первый' cat' никогда не запускается. – chepner

+0

Кроме того, 'outout2.txt' не изменяется; он усекается оператором '>' независимо от того, что еще происходит в конвейере. – chepner

+0

@chepner, вы правы, конечно, о том, что содержимое outout2.txt перезаписывается, и я исправил свой ответ. Что касается источника сообщения об ошибке, я написал, что он был сгенерирован «первым вызовом cat», что означает «cat 2> & 1> outout.txt», который, конечно, выполняет команда, выполняемая первым из двух подклассов, подразумеваемых символом трубы. И различие между «командой» и «оболочкой, которая запускает команду», как правило, устраняется при разговоре об операциях с командной строкой. – Peter

1

Конвейер настроен до обработки выходных перенастроек. Создаются две подоболочки, каждая из которых наследует свои файлы от родителя. Стандартный вывод первой подоболочки используется в качестве стандартного вывода второй подоболочки. Однако первый cat не использует файл, который он наследует для стандартного вывода; он использует outout.txt. В результате на стандартный ввод второго cat ничего не записывается, поэтому он обнаруживает конец файла при первом чтении и выходе, не записывая ничего в outout2.txt. Стандартный ввод первого cat записывается в outout.txt, как и ожидалось.

1

Ну, давайте попробуем:

$ echo "hello" | cat > outout.txt | cat > outout2.txt 
$ cat outout.txt 
hello 
$ cat outout2.txt 

Оказывается, что для Баш, то > Перенаправление имеет более высокий приоритет, чем трубы.

Смежные вопросы