вывод в файл, затем использовать файл для ввода

Есть ли более короткий способ написать это? В основном выведите команду в файл, затем используйте файл в качестве ввода для следующей команды. Я также хочу сохранить файл для просмотра впоследствии.

cmd1 > verylong.txt; cmd2 < verylong.txt

Я знаю, что могу

cmd1 | tee verylong.txt | cmd2

Но поскольку я ожидаю, что «verylong.txt» будет огромным файлом, я подумал, что использовать трубу будет менее эффективно, поскольку это будет содержать весь файл в памяти. Если я использую входной файл, он обрабатывает его по одной строке за раз. (Или мое предположение неверно?)

Было бы здорово, если бы я мог сделать что-то элегантное, как

cmd1 > verylong.txt > cmd2

Насколько мне известно, cmd1 | tee verylong.txt | cmd2 cmd1 | tee verylong.txt | cmd2 cmd1 | tee verylong.txt | cmd2 не будет хранить весь файл в памяти. Фактически, если cmd2 должен был ждать слишком долго, прежде чем потреблять свой вход, cmd1 может блокировать вызов write и разблокировать только тогда, когда cmd2 снова начнет чтение.

Причина этого в том, что существует буфер для канала, и этот буфер по умолчанию ограничен определенным разумным размером .

Конечно, история может отличаться, если cmd2 является sort (или чем-то подобным), где весь ввод должен быть прочитан, прежде чем команда сможет записать свой вывод. В этом случае содержимое всего файла может храниться в памяти cmd2 , но это не зависит от того, использовался ли для этого команды канал или промежуточный файл.

Ответ уже дан правильно. Но если ваша цель – выборочно прочитать ваш verylongfile.txt w / cmd2 , sed может быть другим вариантом.

 cmd1 | sed -e 'w verylongfile.txt' -e '/notinteresting/d' | cmd2 

sed будет использовать весь свой вход в outfile, но только биты, которые не соответствуют /notinteresting/ адресуют к трубе. Или вы можете отменить действие с помощью /interesting/!d который будет писать только строки, которые соответствуют interesting адресу в трубе.

Если это не ваша цель, используйте вместо этого tee – это более эффективный инструмент для записи всего своего ввода как в outfile, так и в pipe.

Существует хитроумный трюк с тройником и подоболочками:

 cat source.lst | tee >(doSomething.sh) >(somethingElse.sh) | somethingFinal.sh 

Я сделал это раньше

 pv -perl source.list | tee >(doSomething.sh) >(somethingElse.sh) | md5sum 

pv даст вам индикатор выполнения, ETA и общую текущую строку. Затем source.lst будет загружаться в doSomething.sh и somethingElse.sh (и на разных процессорах!). Наконец, мы получим md5sum этого огромного файла, только для академических целей.

Что не так с простым двухстрочным файлом? Подобно:

 Cmd1 >filespec Cmd2 <filespec 

Или

 cmd1 >filespec cmd2 filespec 

в любом случае, файл остается в массовом хранилище.