Cosa fa “3> & 1 1> & 2 2> & 3” in uno script?


Risposte:


77

I numeri sono descrittori di file e solo i primi tre (che iniziano con zero) hanno un significato standardizzato:

0 - stdin
1 - stdout
2 - stderr

Quindi ognuno di questi numeri nel tuo comando fa riferimento a un descrittore di file. È possibile reindirizzare un descrittore di file a un file >o reindirizzare a un altro descrittore di file con>&

L' 3>&1nella riga di comando creerà un nuovo descrittore di file e destinarli a 1che è STDOUT. Ora 1>&2reindirizzerà il descrittore di file 1 su STDERRe 2>&3reindirizzerà il descrittore di file 2 su 3 che è STDOUT.

Quindi sostanzialmente sei passato STDOUTe STDERR, questi sono i passaggi:

  1. Crea un nuovo fd 3 e puntalo al fd 1
  2. Reindirizzare il descrittore di file 1 al descrittore di file 2. Se non avessimo salvato il descrittore di file in 3 perderemmo la destinazione.
  3. Reindirizzare il descrittore di file 2 al descrittore di file 3. Ora i descrittori di file uno e due vengono commutati.

Ora se il programma stampa qualcosa sul descrittore di file 1, verrà stampato sul descrittore di file 2 e viceversa.


Hai detto "Il 3> & 1 nella tua riga di comando creerà un nuovo descrittore di file e lo reindirizzerà su 1 che è STDOUT". Ma 1 non significa STDIN?
sofs1

19

Si sta scambiando stdoute stderr.

>namesignifica reindirizzare l'output su file name.

>&numbersignifica reindirizzare l'output al descrittore di file number.

Quindi &è necessario dire alla shell che intendi un descrittore di file, non un nome di file.

Un descrittore di file è un numero che fa riferimento a un file già aperto. Quelli standard sono 0per input standard, 1per output standard o 2per errore standard. Puoi anche usare qualsiasi altro numero, che creerà un nuovo descrittore di file, proprio come quando crei una nuova variabile con var=value.

Per impostazione predefinita, entrambi descrittori di file 1e 2vai a /dev/tty, quindi se si esegue somecommand 3>&1 1>&2 2>&3in una nuova shell, non cambia nulla (tranne ora che si dispone di un descrittore di file numero 3).

Ma se da qualche parte in precedenza nello script esegue un reindirizzamento usando exec (ad es. exec 2>error.log), Oppure lo script viene eseguito con una riga di comando che include il reindirizzamento (ad es. ./thescript 2>error.log), Lo scambio di stdout e stderr farà qualcosa.

Nel tuo caso specifico, il comando che sta cambiando stdout e stderr è dialog. Guardando la sua pagina man , vedo

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

quindi forse la persona che ha scritto la sceneggiatura vuole che dialogl'output vada stdoutinvece che stderrper qualche motivo.

Vedi anche Ordine dei reindirizzamenti


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.