Jak przekierować wyjście na ekran, a także do pliku?

12

Moim celem jest zalogowanie wszystkich danych wyjściowych skryptu do katalogu, który skrypt utworzy.

Mam na przykład:

~/.abc.sh:

#! /bin/bash
rails new myapp

Kiedy biegnę ...

cd ~/code
. ~/.abc.sh

... która utworzy nową aplikację Rails w katalogu ~/code/myapp.

Gdy Rails tworzy aplikację, wyświetla całą treść, którą chcę przechwycić i zapisać w pliku dziennika w tym samym katalogu, w którym railsnowo utworzone polecenie. Chcę również wyświetlić ten tekst w terminalu.

Jak mam to zrobić?

Zabba
źródło

Odpowiedzi:

23

Możesz użyć do tego teepolecenia:

command | tee /path/to/logfile

Równoważny bez pisania w powłoce byłby:

command > /path/to/logfile

Jeśli chcesz dołączyć ( >>) i wyświetlić dane wyjściowe w powłoce, użyj -aopcji:

command | tee -a /path/to/logfile

Należy pamiętać, że rura będzie przechwytywać tylko stdout, błędy stderr nie są przetwarzane przez potok z tee. Jeśli chcesz rejestrować błędy (z stderr), użyj:

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

Oznacza to: uruchom commandi przekieruj strumień stderr (2) na stdout (1). Zostanie on przekazany do teeaplikacji wraz z aplikacją.

Lekensteyn
źródło
Czy masz na myśli ~/.abc.sh | tee <file>? Jeśli tak, to problem polega na tym, że nie wiem, w którym katalogu skrypt utworzy aplikację, gdy ją wywołam, więc skąd mam wiedzieć, co podać w fileargumencie? (Dzięki za wspaniałe przykłady)
Zabba
@Zabba: co powiesz na utworzenie pliku tymczasowego i przeniesienie go później?
Lekensteyn
Ok, to powinno działać :). W związku z tym, jak utworzyć plik tymczasowy o losowej nazwie, który mogę następnie wyprowadzić do, a następnie skopiować w wybrane miejsce? Czy jest jakieś wbudowane polecenie uzyskania „tymczasowej nazwy pliku”?
Zabba
@Zabba: polecenie to mktemp. Zobacz stronę podręcznika man mktemp.
Lekensteyn
Work, pracuj jak urok
niedz Junwen
0

scriptrozpocznie sesję interaktywną i zapisze wszystkie dane wyjściowe (stdout / stderr itp.) do pliku lub (wraz z -cparametrem) uruchomi polecenie i zapisze dane wyjściowe.

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

Uwaga: w sesji interaktywnej możesz zatrzymać nagrywanie, wychodząc z sesji w normalny sposób (np. exitLub Ctrl-D).

Do nagrywania sesji z odtwarzaniem wideo możesz również spróbować asciinema .

mwfearnley
źródło