Ja Unix čaulā es gribu apvienot stderr
un stdout
plūsmā stdout
, lai turpinātu manipulēt ar to, komandas beigās es varu pievienot šādu tekstu:
2>&1
Tātad, ja es gribu izmantot head
uz g++
izvades, es varu rīkoties šādi:
g++ lots_of_errors 2>&1 | head
lai es redzētu tikai dažas pirmās kļūdas.
Man vienmēr ir grūtības to atcerēties, un man nepārtraukti nākas to meklēt, un tas galvenokārt tāpēc, ka es pilnībā neizprotu šī konkrētā trika sintaksi.
Vai kāds var to izjaukt un izskaidrot rakstzīmi pa rakstzīmei, ko nozīmē 2>&1
?
Faila deskriptors 1 ir standarta izvade (stdout
).
Faila deskriptors 2 ir standarta kļūda (stderr
).
Lūk, viens no veidiem, kā atcerēties šo konstrukciju (lai gan tas nav pilnīgi precīzs): sākumā 2>1
var šķist labs veids, kā novirzīt stderr
uz stdout
. Tomēr patiesībā tas tiks interpretēts kā "novirzīt stderr
uz failu ar nosaukumu 1
". &
norāda, ka seko faila deskriptors, nevis faila nosaukums. Tādējādi konstrukcija kļūst: 2>&1
.
echo test > afile.txt
novirza stdout uz afile.txt
. Tas ir tas pats, kas
echo test 1> afile.txt
Lai pāradresētu stderr, veiciet:
echo test 2> afile.txt
>&
ir sintakse, lai novirzītu plūsmu uz citu faila deskriptoru - 0 ir stdin, 1 ir stdout, bet 2 ir stderr.
Jūs varat pāradresēt stdout uz stderr, veicot:
echo test 1>&2 # or echo test >&2
Vai otrādi:
echo test 2>&1
Tātad, īsumā... 2>
novirza stderr uz (nenoteiktu) failu, pievienojot &1
novirza stderr uz stdout.
Šie skaitļi attiecas uz faila deskriptoriem (fd).
stdin
2>&1
novirza fd 2 uz 1.
Tas darbojas ar jebkuru failu deskriptoru skaitu, ja programma tos izmanto.
Jūs varat apskatīt /usr/include/unistd.h
, ja esat tos aizmirsuši:
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
Esmu rakstījis C rīkus, kas izmanto nestandarta failu deskriptorus pielāgotai reģistrēšanai, tāpēc jūs to neredzēsiet, ja vien nepārvirzīsiet to uz failu vai kaut ko tamlīdzīgu.