Capturați toate ieșirile unui script într-un fișier (din scriptul însuși) [duplicat]

Această întrebare are deja răspunsuri aici :

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

  • Soluția dvs. se adresează STDOUT, dar nu STDERR
  • Am pus un exemplu cu 2>&1
  • Nu ' nu cred că acest lucru răspunde la întrebare deoarece cerința nr. 1 a fost " ./myscript.sh fără construcții de shell suplimentare ".
  • Această întrebare a fost editată acum 6 ore, nu ' nu am acele informații când am răspuns prima dată la întrebare. Folosea ieșirea > în loc de tee și de aceea am împărtășit opțiunea pentru tee.

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-linux script)

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *