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?

Risinājums

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.

Komentāri (18)
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.

Komentāri (5)

Šie skaitļi attiecas uz faila deskriptoriem (fd).

  • Nulle ir stdin
  • Viens ir `stdout
  • divi ir `stderr

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.

Komentāri (0)