Czy istnieje prosty sposób na zarejestrowanie wszystkich działań wykonywanych przez skrypt powłoki?

18

Czy istnieje prosty sposób na zarejestrowanie całej aktywności ze skryptu powłoki do pliku?

Mam scenariusz Wyświetla rzeczy takie jak „instrukcje” echa, a także inne dane wyjściowe programu. Znam polecenia:

command | tee -a "$log_file"

i

command >> logifle.log

Pytam o to, czy istnieje parametr powłoki do logowania, polecenie set, którego mogę użyć, czy coś takiego. Niekoniecznie chcę dodawać dziesiątki przekierowań lub tee do plików, jeśli nie muszę. Nadal chcę uzyskać wyjście standardowe - chcę też, aby zostało zarejestrowane .:wq

j0h
źródło
5
LOL
,:
1
denerwuje mnie myśl, że większość ludzi robi to zamiast: x
Przeproś i przywróć Monikę

Odpowiedzi:

18

jeśli normalnie uruchamiasz skrypt przy pomocy foo.sh, spróbuj go uruchomić (zakładając, że jest to skrypt bash) przy pomocy bash -x foo.sh. Jeśli chcesz, aby wszystko zostało przekierowane do pliku, spróbuj bash -x foo.sh > file.log 2>&1(pamiętaj, że przekierowuję również stderr, usuń, 2>&1jeśli tego nie chcesz). Jeśli chcesz zobaczyć, co się dzieje bash -x foo.sh 2>&1 | tee log.file.

roadmr
źródło
20

Istnieje bardzo łatwy i wygodny sposób:

Używanie scriptdo tworzenia maszynopisu sesji terminalowej

  1. Uruchom polecenie script

    Jeśli argument filejest podany, na przykład script ~/tmp/output, scriptzapisuje dialog w tym pliku. Jeśli nie podano nazwy pliku, dialog jest zapisywany w plikutypescript

  2. Uruchom skrypt lub cokolwiek chcesz zacząć

  3. Jeśli skrypt jest zakończony, zatrzymaj się scriptza pośrednictwem Ctrl-D

  4. Sprawdź dane wyjściowe w domyślnym pliku wyjściowym typescript


Aby rozpocząć polecenie w jednym kroku script, użyj parametru-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

Użycie scriptwewnętrznego skryptu nie ma sensu, ponieważ scriptrozwidla powłokę lub uruchamia nową powłokę.

Jeśli istnieje zmienna SHELL, powłoka rozwidlona przez skrypt będzie tą powłoką. Jeśli SHELL nie jest ustawiony, zakłada się powłokę Bourne'a. (Większość powłok ustawia tę zmienną automatycznie).

AB
źródło
4
@ Fabby Podoba mi się moja odpowiedź, ale nie widzę tej małej szarej rzeczy;)
AB
Używam script logfilename, więc mogę to wybrać.
waltinator,
czy mogę wywołać „skrypt” z mojego programu powłoki?
j0h
1
To nie ma sensu, patrz moja ulepszona odpowiedź.
AB
1
+1. Dzięki za tę odpowiedź :-) scriptprzydaje się również monitorowanie za pośrednictwem fifo. From man script: „ -f, --flushOpróżnij wyjście po każdym zapisie. Jest to miłe dla współpracy telefonicznej: jedna osoba robi mkfifo foo; script -f foo, a druga może nadzorować w czasie rzeczywistym, co się robi za pomocą cat foo”. Może być również używany do monitorowania, gdy program czeka na dane wejściowe lub jest wykonywany, na przykład przez monitorowanie znacznika czasu fifo.
sudodus