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

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

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

я пробовал

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 

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

  • Как я могу отправлять чтения и записи в одном дескрипторе файла в разные места?
  • Как вставить текст в файл root, используя sudo?
  • Перенаправить stdin и stdout в порты
  • stdin 'hop' над процессом?
  • Как перенаправление файлов bash на стандарт отличается от shell (`sh`) в Linux?
  • Получение фоновых заданий путем записи в файл
  • запуск команды в фоновом режиме и вывод на печать в файл без печати на экран
  • Заполнение вкладки bash не работает в & & redirection
  • 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 
    Linux и Unix - лучшая ОС в мире.