Перенаправить вывод всех команд в файл, а не только последний

Я хочу добавить заголовок в файл с эхом, а затем использовать команду для создания остальной части файла. Это означает, что я буду использовать две отдельные команды.

Как написать вывод из обеих команд в файл с перенаправлением?

я пробовал

echo "header line" | cut -c 1-5 input_file > output_file echo "header line"; cut -c 1-5 input_file > output_file 

Это только перенаправляет вывод из команды cut.

Следующая команда работает, но чувствует себя неуклюжей:

 echo "header line" > output_file; cut -c 1-5 input_file >> output_file 

Каков умный способ решения моей проблемы?

3 Solutions collect form web for “Перенаправить вывод всех команд в файл, а не только последний”

Проблема здесь не проблема с перенаправлением Linux; скорее, это фундаментальное непонимание того, как работает трубопровод. Перенаправление здесь не работает, потому что только вырезание на самом деле печатает на stdout. Команда stdout для команды echo передается по каналу на stdin cut (который не используется в этом случае, так как указан файл).

 echo "header line" > output_file && cut -c 1-5 input_file >> output_file 

это то, что вы хотите, и не совсем неэлегантное (я заменил ваш ; с && так что команда cut будет выполняться только, если заголовок успешно записан, таким образом он не будет выполняться, если у вас нет прав на создание или запись to output_file).

Вы также можете сделать все это в подоболочке, например.

 (echo "header line"; cut -c 1-5 input_file) > output_file 

но нет никакой реальной выгоды для этого, и с более сложными примерами это может вызвать проблемы, если вы не знакомы с тем, как подселлем охвачены области.

Если вы хотите, чтобы вырезать, чтобы пройти stdin до stdout, вы можете попробовать:

 echo "header line" | cut -c 1-5 - input_file 

(Тире – общий ярлык для stdin)

Тем не менее, это также будет выполнять операцию разреза на stdin (в результате получается строка заголовка «header»). Трудно сказать, это то, чего вы хотите или нет.

Что вы ищете:

 { echo "header line"; cut -c 1-5 input_file; } > output_file 
  • Этот синтаксис не имеет побочных эффектов, поскольку команды выполняются в текущей оболочке, а не в подоболочке
  • Существует четкое разграничение команд, которые идут в файл output_file
  • Он хорошо масштабируется, так как вы можете переписать его таким образом:

 { echo "header line" cut -c 1-5 input_file ... # insert new commands here } > output_file 

Если вы хотите, чтобы выход ошибки поступал в тот же файл, вы можете изменить последнюю строку следующим образом:

 } > output_file 2>&1 

Спасибо Olivier Dulac за то, что он напомнил этот совет.

Если вы хотите, чтобы какой-то вывод внутри блока отображался на вашем экране, вы можете использовать этот синтаксис:

 { echo "header line" echo "this line doesn't go to output_file" > /dev/tty cut -c 1-5 input_file } > output_file 

Чтобы завершить ответы, есть exec.

 exec > output_file echo "header line" cut -c 1-5 input_file 
  • Это UUOC (бесполезное использование кошки) для перенаправления одного файла на другой?
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • Почему / dev / stderr недействителен при перенаправлении на канал в cygwin?
  • Не удалось запустить процесс в фоновом режиме
  • Как организовать и отрезать эту часть каталога в файл?
  • Как я могу передавать данные по сети или последовательно на дисплей другой Linux-машины?
  • Почему директива stdout в файл непоследовательна и отложена?
  • Перенаправить stdout через ssh
  • сокращение для подачи содержимого нескольких файлов в stdin скрипта
  • Вывод консоли из существующих процессов (процессов) в файл
  • sed -e '$! d' работает не так, как ожидалось?
  • Linux и Unix - лучшая ОС в мире.