Как перенаправить вывод на экран, а также в файл?

12

Моя цель - записать весь вывод скрипта в каталог, который скрипт создаст.

Например, у меня есть:

~/.abc.sh:

#! /bin/bash
rails new myapp

Когда я бегу ...

cd ~/code
. ~/.abc.sh

... это создаст новое приложение Rails в каталоге ~/code/myapp.

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

Как мне это сделать?

Zabba
источник

Ответы:

23

Вы можете использовать teeкоманду для этого:

command | tee /path/to/logfile

Эквивалент без записи в оболочку будет:

command > /path/to/logfile

Если вы хотите добавить ( >>) и показать вывод в оболочке, используйте -aпараметр:

command | tee -a /path/to/logfile

Обратите внимание, что канал будет перехватывать только stdout, ошибки в stderr не обрабатываются с помощью канала tee. Если вы хотите регистрировать ошибки (из stderr), используйте:

command 2>&1 | tee /path/to/logfile

Это означает: запустить commandи перенаправить поток stderr (2) в stdout (1). Это будет передано в трубу с teeприложением.

Lekensteyn
источник
Вы имеете в виду ~/.abc.sh | tee <file>? Если это так, то проблема в том, что я не знаю, в каком каталоге скрипт будет создавать приложение, когда я его вызываю, так как я узнаю, что дать в fileаргументе? (Спасибо за отличные примеры)
Забба
@Zabba: а как насчет создания временного файла и его последующего перемещения?
Лекенштейн
Хорошо, это должно работать :). В связи с этим, как мне создать временный файл со случайным именем, который я затем могу вывести в и затем скопировать в нужное место? Есть ли какая-то встроенная команда для получения «имени временного файла»?
Забба
@Забба: команда для этого есть mktemp. Смотрите страницу руководства man mktemp.
Лекенштейн
Work, работать как очарование
Sun Junwen
0

scriptзапустит интерактивный сеанс и запишет весь вывод (stdout / stderr и т. д.) в файл, или (с -cпараметром) запустит команду и запишет вывод этого.

script -c ~/.abc.sh -f abc.log

Примечание. В интерактивном сеансе вы можете остановить запись, просто выйдя из сеанса, как обычно (например, exitили Ctrl-D).

Для записи сеанса с воспроизведением видео, вы также можете попробовать Asciinema .

mwfearnley
источник