Ko nozīmē " 2>&1 "?
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
?
2112
3
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ītstderr
uzstdout
. Tomēr patiesībā tas tiks interpretēts kā "novirzītstderr
uz failu ar nosaukumu1
".&
norāda, ka seko faila deskriptors, nevis faila nosaukums. Tādējādi konstrukcija kļūst:2>&1
.novirza stdout uz
afile.txt
. Tas ir tas pats, kasLai pāradresētu stderr, veiciet:
>&
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:
Vai otrādi:
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: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.