Як перенаправити вихід на екран, а також на файл?


12

Моя мета - занести весь вихід із сценарію в каталог, який збирається створити.

Наприклад, у мене є:

~/.abc.sh:

#! /bin/bash
rails new myapp

Коли я біжу ...

cd ~/code
. ~/.abc.sh

... це створить нову програму Rails у каталозі ~/code/myapp.

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

Як мені це робити?

Відповіді:


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додатком.


Ви маєте на увазі ~/.abc.sh | tee <file>? Якщо так, то проблема в тому, що я не знаю, в якому каталозі сценарій буде створювати додаток, коли я його викликаю, тож як я можу знати, що надати fileаргумент? (Дякую за чудові приклади)
Zabba

@Zabba: а як створити тимчасовий файл і перемістити його згодом?
Лекенштейн

Гаразд, це має працювати :). Що стосується цього, як я можу створити тимчасовий файл із випадковим іменем, до якого я можу вивести, а потім скопіювати в потрібне місце? Чи є якась вбудована команда, щоб отримати "тимчасове ім'я файлу"?
Забба

@Zabba: команда для цього є mktemp. Дивіться сторінку керівництва man mktemp.
Лекенштейн

跪拜, працюй як принадність
Sun Junwen

0

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

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

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

Для запису сеансу з відтворенням відео можна також спробувати asciinema .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.