În timp ce utilizați nohup pentru a pune o comanda pentru a rula în fundal unele de conținut apar în terminal.
cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error
Vreau să salvez acest conținut într-un fișier.
Există două principale fluxurile de ieșire în Linux (și alte OSs), standard de ieșire (stdout) și standard de eroare (stderr). Mesajele de eroare, cum ar fi cele de show, sunt tipărite la standard de eroare. Clasic redirecționarea operator (comanda > file
) numai redirecționează standard de ieșire, astfel încât eroarea standard este încă afișat pe terminal. Pentru a redirecționa stderr la fel de bine, aveți câteva opțiuni:
command > 2>eroare
>out
), și apoi redirecționează la stdout stderr (2>&1
):command >2>&1
bash " și " zsh
- l sprijine, de exemplu, dar sh
si ksh
nu):command &> afară
Pentru mai multe informații cu privire la diferitele control și redirecționarea operatorii, a se vedea aici.
Primul lucru de remarcat este că nu's de două feluri în funcție de scopul și shell, prin urmare, acest lucru necesită înțelegerea ușoară a mai multor aspecte. În plus, anumite comenzi, cum ar fi "timpul" și strace
scrie spre stderr în mod implicit, și poate sau nu poate furniza o metoda de redirecționare specifice la comanda
Teoria de bază din spatele de redirecționare este un proces generat de coajă (presupunând că este o comandă externă și nu în coajă built-in) este creat prin fork () " și " execve()
syscalls, și înainte de faptul că se întâmplă un alt syscall dup2()
efectuează necesar redirecționează înainte de execve()
se întâmplă. În acest sens, redirectionari sunt moștenite de la mamă shell. La m&>n " și "m>n.txt
informa shell cu privire la modul de a efectua open ()" și " dup2()
syscall (a se vedea, de asemenea, Cum de intrare redirecționare de lucrări, care este diferența între redirection și conducta, ceea Ce face & spun exact în redirecționarea de ieșire )
Cel mai tipic, este via 2>
în Bourne-cum ar fi cochilii, precum "dash" (care este symlinked a /bin/sh
) și bash
; prima este implicit și POSIX compatibile shell și alte este ceea ce majoritatea utilizatorilor folosesc pentru sesiune interactivă. Acestea diferă în sintaxă și caracteristici, dar, din fericire pentru noi, pentru eroare flux de redirecționare funcționează la fel (cu excepția &>
non standard). În caz de csh și derivații săi, la stderr redirecționarea nu't destul de munca acolo.
Las's vin înapoi la 2>
parte. Două lucruri esențiale pentru a observa: "> "înseamnă redirecționarea operator, unde vom deschide un fișier și" 2 " număr întreg reprezintă stderr descriptor de fisier; în fapt, aceasta este exact cum POSIX standard pentru shell limba definește redirecționarea în secțiunea 2.7:
[n]redir-op word
Pentru simplu "> " redirecționare, 1
întreg este implicită pentru stdout, adică
echo Hello World > /dev/nulleste la fel ca
echo Hello World 1>/dev/null. Rețineți, că întreg sau redirecționarea operator nu poate fi citat, în caz contrar shell nu't să le recunoască ca atare, și în loc tratează ca literal șir de text. Cum pentru spațierea, l's important ca întreg este chiar lângă redirecționarea operator, dar fișier poate fi fie lângă redirecționarea operator sau nu, de exemplu,
comanda 2>/dev/null " și " comandă 2> /dev/null` va funcționa bine.
Oarecum sintaxă simplificată pentru tipică de comandă în coajă ar fi
command [arg1] [arg2] 2> /dev/null
Trucul aici este faptul că redirecționarea poate apărea oriunde. Care este atât de 2> command [arg1] " și " comandă 2> [arg1]
sunt valabile. Rețineți că pentru bash shell, nu există &> mod de a redirecționa ambele stdout și stderr fluxuri în același timp, dar din nou - 's bash specifice și dacă te're lupta pentru portabilitate de script-uri, este posibil să nu funcționeze. A se vedea, de asemenea, [Ubuntu Wiki][8] și [care este diferența între &> 2>&1][9]. *Notă:* "> " operator de redirectare *trunchiază* un fișier și suprascrie-l, dacă fișierul există. 2>>
poate fi folosit pentru adăugarea `stderr la dosar.
Dacă puteți observa, "> " este destinat pentru o singura comanda. Pentru script-uri, putem redirecționa stderr flux de tot scenariul din exterior în myscript.sh 2> /dev/null sau ne pot face uz de exec built-in. Exec built-in are puterea de a reface legăturile de flux pentru întreaga sesiune de shell, ca să spunem așa, fie interactiv sau prin intermediul script-ul. Ceva de genul
#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file
În acest exemplu, fișierul jurnal ar trebui să arate imediat: nu se poate de stat '/etc/non_existing_file': Nu există un astfel de fișier sau director`. Încă un alt mod este prin intermediul funcțiilor. Ca kopciuszek menționat în răspunsul său, putem scrie funcția de declarație cu deja atașat de redirecționare, care este
some_function(){
command1
command2
} 2> my_log_file.txt
Comenzi cum ar fi "timpul" și strace
scrie lor spre stderr în mod implicit. În caz de "timp" de comandă, singura alternativă viabilă este de a redirecționa producția de întreaga comandă , care este
time echo foo 2>&1 > file.txt
alternativ, sincron listă sau subshell-ar putea fi redirecționat dacă doriți să se separe de ieșire ( așa cum se arată în legate de post ):
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
Alte comenzi, cum ar fi strace " sau " dialog
oferă mijloace pentru a redirecționa stderr. strace
a -o <nume de fișier.txt> opțiune care permite specificarea fișierului de ieșire în cazul în care ar trebui să fie scris. Există, de asemenea, o opțiune pentru a scrie un textfile pentru fiecare subproces care
stracevede. La
dialogcomanda scrie textul interfață de utilizator pentru a stdout dar spre stderr, astfel încât, în scopul de a - [i salva de ieșire variabile][11] ( pentru că
var=$ (...) și conducte primește doar stderr ) avem nevoie de a schimba descriptorii de fișier
result=$(dialog --inputbox test 0 0 2>&1 1>/dev/tty);
dar în plus, există --output-fd
pavilion, pe care am, de asemenea, pot utiliza. Nu's, de asemenea, metoda de pipe cu nume. Recomand citirea legate post despre dialog
comanda pentru o descriere amănunțită a ceea ce's-a întâmplat.