2012-12-28 5 views
5

Spesso ho difficoltà a capire determinati costrutti del linguaggio perché non si registreranno quando si cercano su Google o si distruggono. Con un po 'di sperimentazione, è spesso semplice capirlo, ma non lo capisco.Cosa significa "meno" in "exec 3> & -" e come lo uso?

Spesso vedo cose come 2>&1 o 3>&- in script bash. So che questa è una sorta di reindirizzamento. 1 è stdout e 2 è stderror. 3 è probabilmente personalizzato. Ma qual è il meno?

Inoltre, ho uno script di cui voglio registrare l'output, ma voglio anche vederlo sullo schermo. Io uso exec > >(tee $LOGFILE); exec 2>&1 per quello. Funziona. Ma a volte, quando bashtrap questo script, non riesco più a digitare il prompt. L'output è nascosto dopo Ctrl+C. Posso utilizzare un canale personalizzato e il segno meno per risolvere il problema oppure non è correlato?

+1

Hai due risposte precise. Il documento [Csh Programming Considered Harmful] (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/) copre anche l'uso di queste annotazioni e spiega perché le conchiglie dovrebbero essere lasciate sul riva del mare e non usato per scrivere copioni. –

risposta

5
  1. 2>&1 significa che stderr viene reindirizzato in stdout
  2. 3>&- significa che file descrittore 3, aperto per la scrittura (stesso come stdout), è chiuso.

È possibile vedere più esempi di reindirizzamento here

  1. Per quanto riguarda le domande numero 3, penso this è un buon collegamento.
4

Il 3>&- chiudere il numero di descrittore di file 3 (probabilmente è stato aperto prima con 3>filename).

Il 2>&1 reindirizza l'output del descrittore di file 2 (stderr) alla stessa destinazione del descrittore di file 1 (stdout). Questo muore chiamare syscall dup2().

Per ulteriori informazioni sul reindirizzamento del descrittore di file, consultare le manpage di bash (`man bash). Sono densi ma grandiosi.

per lo script, lo farei così:

#!/bin/bash 
if [[ -z $recursive_call ]]; then 
    recursive_call=1 
    export recursive_call 
    "$0" "[email protected]" | tee filename 
    exit 
fi 
# rest of the script goes there 

Si perde il codice di uscita dal copione però. C'è un modo in bash per capirlo, ma non riesco a ricordarlo ora.