Comentarii
- Pentru cei care ajung aici de la Google, s-ar putea să luați în considerare și acest răspuns ( unix.stackexchange.com/a/164017/103505 ) pentru a pune tot codul doriți să ieșiți într-o funcție din script și apoi să redirecționați ieșirea acelei funcții.
Răspuns
O metodă pe care am găsit-o pentru a captura toate ieșirile din orice sesiune este să încep o nouă sesiune bash și să tee într-un fișier jurnal. este cu adevărat util pentru a urmări mai mult decât doar un script.
bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended
sau poți pur și simplu să teești scriptul
./myscript.sh | tee ./myscript.log #this will log only the output of the script.
Comentarii
Răspuns
Puteți invoca oricând script
într-un script pentru înregistrați totul.
În ceea ce privește imprimarea și înregistrați totul în același timp într-un script bash la log.txt
:
Vizualizarea jurnalului log.txt
:
$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018
Comentarii
- Dacă înțeleg corect (unele explicații ar ajuta :), scriptul încearcă să detecteze dacă ' rulează sub
script
și nu se reexecută singur. Începând cu Ubuntu 20, se pare că$SCRIPT
nu este setat, deci scriptul intră într-o buclă infinită. - O idee bună de a utiliza
script
totuși, deoarece permite ieșirea interactivă a terminalului, de ex Întoarcerea cu trăsura, la serviciu. De fapt, comenzile care afișează o singură linie de ieșire de progres (arhivatori de exemplu), se comportă normal . În ceea ce privește rezolvarea problemei cu buclă infinită, putem testa nivelul shell :if (( $SHLVL < 3 )); then script...; fi
. - De asemenea, argumentele scripturilor ajung să fie concatenate și transmise în argumentul cod către shell pornit de
script
(nu/bin/bash
, acel argument/bin/bash
este ignorat cu util-linuxscript
)
Răspuns
Doriți să utilizați tee .
Ex:
echo "Hello World" | tee out.txt
Aceasta creează un fișier out.txt cu ieșirea din comandă și îl imprimă pe ecran. Utilizați „tee -a file name” dacă doriți să atașați fișierul.
echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt
out.txt va avea două linii Hello and World (fără -a it ar avea doar lume)
Dacă doriți să salvați întregul script și să scoateți întregul script:
./script.sh | tee output.txt
Comentarii
- Soluția dvs. se adresează STDOUT, dar nu STDERR
- unix.stackexchange.com/a/61932/268823 explică cum să faceți STDOUT și STDERR
- Nu ' nu cred că acest lucru răspunde la întrebare deoarece cerința nr. 1 a fost " run ./myscript.sh fără construcții de shell suplimentare ".
- Cred că o modalitate de a o face ar fi pentru a pune totul într-o funcție și utilizați tee la final. Acest lucru ar funcționa efectiv ca o pornire și oprire a capturii. Și redirecționarea STDERR dacă aceasta este intenția.
2>&1
>
în loc de tee și de aceea am împărtășit opțiunea pentru tee.