Учтем:Простая оболочка. Смешанные трубы и выход
cat > outout.txt | cat > outout2.txt
Я не знаю, как интерпретировать что-то подобное. Каков вход для второй команды?
Учтем:Простая оболочка. Смешанные трубы и выход
cat > outout.txt | cat > outout2.txt
Я не знаю, как интерпретировать что-то подобное. Каков вход для второй команды?
Если коту не присвоен аргумент имени файла, он принимает данные от 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
Технически это не первый «котик», генерирующий сообщение об ошибке, это подоболочка, созданная каналом, который выполняет «cat». Как только оболочка не откроет 'outout.txt', первый' cat' никогда не запускается. – chepner
Кроме того, 'outout2.txt' не изменяется; он усекается оператором '>' независимо от того, что еще происходит в конвейере. – chepner
@chepner, вы правы, конечно, о том, что содержимое outout2.txt перезаписывается, и я исправил свой ответ. Что касается источника сообщения об ошибке, я написал, что он был сгенерирован «первым вызовом cat», что означает «cat 2> & 1> outout.txt», который, конечно, выполняет команда, выполняемая первым из двух подклассов, подразумеваемых символом трубы. И различие между «командой» и «оболочкой, которая запускает команду», как правило, устраняется при разговоре об операциях с командной строкой. – Peter
Конвейер настроен до обработки выходных перенастроек. Создаются две подоболочки, каждая из которых наследует свои файлы от родителя. Стандартный вывод первой подоболочки используется в качестве стандартного вывода второй подоболочки. Однако первый cat
не использует файл, который он наследует для стандартного вывода; он использует outout.txt
. В результате на стандартный ввод второго cat
ничего не записывается, поэтому он обнаруживает конец файла при первом чтении и выходе, не записывая ничего в outout2.txt
. Стандартный ввод первого cat
записывается в outout.txt
, как и ожидалось.
Ну, давайте попробуем:
$ echo "hello" | cat > outout.txt | cat > outout2.txt
$ cat outout.txt
hello
$ cat outout2.txt
Оказывается, что для Баш, то >
Перенаправление имеет более высокий приоритет, чем трубы.
Если вы хотите кота в оба файла, проверьте «tee». –