Ordine dei reindirizzamenti


29

Non capisco bene come il computer legge questo comando.

cat file1 file2 1> file.txt 2>&1

Se ho capito, 2>&1reindirizza semplicemente l'errore standard all'output standard.

Secondo questa logica, il comando mi legge come segue:

  1. concatenare file file1e file2.

  2. invia stdoutda questa operazione a file.txt.

  3. invia stderra stdout.

  4. fine?

Non sono sicuro di cosa stia facendo il computer. Secondo la mia logica, il comando dovrebbe essere

cat file1 file2 2>&1 > file.txt

ma questo non è corretto.

Risposte:


46

Trovo più facile pensare all'utilizzo dei compiti.

  • > è come =
  • & è come $

Inizi con

1 = /dev/tty
2 = /dev/tty

allora il tuo primo esempio 1> file.txt 2>&1, lo fa

1 = file.txt
2 = $1           # and currently $1 = file.txt

lasciandoti con

1 = file.txt
2 = file.txt

Se l'hai fatto nell'altro modo, ricomincerai da capo

1 = /dev/tty
2 = /dev/tty

allora lo 2>&1 > file.txtfa

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

quindi il risultato finale è

1 = file.txt
2 = /dev/tty

e hai solo reindirizzato stdout, no stderr.


ho un po 'capito l'analogia, ma è confusa - che cosa significa $?
Eliran Malka,

In un compito simile var=$othervar, $introduce il nome della variabile sul lato destro. In un reindirizzamento simile 2>&1, &introduce il numero del descrittore di file sul lato destro. Sto dicendo che puoi pensarlo come "il file 2 è uguale al file 1". (Ma ci sono due tipi di uguali: <significa "per leggere" e >significa "per scrivere".)
Mikel

12

L'ordine di reindirizzamento è importante e devono essere letti da sinistra a destra .

Ad esempio: command 2>&1 >somefilesignifica:

  1. Reindirizzare stderr(ovvero 2) alla destinazione corrente di stdout(a questo punto, il terminale).
  2. Quindi cambia stdoutper andare a somefile.

Quindi, in questo caso, stderrva al terminale e stdoutva a un file, che non è quello che probabilmente vuoi.

D'altra parte, command >somefile 2>&1significa:

  1. Reindirizza stdoutasomefile
  2. Quindi reindirizzare stderralla stessa destinazione di stdout( somefile).

In quest'ultimo caso entrambi stderre stdoutvai a somefile, che è probabilmente quello che vuoi.


4
cat file1 file2 1> file.txt 2>&1

>& In realtà significa duplicato, utilizza la chiamata di sistema duplex per mappare un nuovo descrittore di file su un file già aperto.

Quindi, tu (bash in realtà) devi prima aprire il nuovo stdout prima, dicendo "e reindirizzare stderr a qualunque stdout sia attualmente impostato".


Questo e spettacolare! me lo stavo chiedendo &. potresti racchiudere alcuni riferimenti a quella sintassi o, meglio ancora, alcune buone risorse sul suddetto sistema duplex?
Eliran Malka,

1
'man dup' documenta la chiamata di sistema.
X Tian,

ha un senso :) grazie
Eliran Malka il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.