perché eseguire un command di shell Linux con &?

Sto usando la versione 5 di Red Hat Linux Enterprise. Ho notato che alcune persone eseguono comandi con un paio di opzioni. Ad esempio, nel command sotto ci sono due segni. Qual è lo scopo di loro? Sono sempre utilizzati insieme a nohup?

 nohup foo.sh <script parameters> >& <log_file_name> & 

Oltre alle risposte di Martin, Ash e Kevin, a volte vednetworking un ampersand usato mathmente per un bitwise AND * :

 $ echo $(( 11 & 7 )) 3 

Nel caso in cui non si conoscono gli operatori di bit:

 11: 1011 7: 0111 -------- AND 3: 0011 

In each posizione c'è un bit nel primo numero e il secondo numero, impostare quel bit a uno nella risposta.

* La caratteristica nella risposta di Kevin è indicata come AND logica .

Per elaborare la risposta di Ash, se utilizzata per il reindirizzamento, l'ampersand può dire alla shell di copiare un descrittore di file. In questo command echo "hello" > outputfile 2>&1 l'ampersand causa qualsiasi output che può andare all'errore standard (stderr, descrittore di file 2) per andare allo stesso posto dell'output standard (stdout, descrittore file 1, l'impostazione predefinita per lato sinistro di > ). L'operatore >& outputfile è abbreviato per > outputfile 2>&1 .

Inoltre, nuovo in Bash 4, ci sono due nuovi terminatori per le clausole nel command case ;& e ;;& che influenzano se un caso "cade" e, in caso affermativo, se viene eseguito il prossimo test.

In script di shell bash, l'ampersand "&" viene usato per processi fork:

 find -name hello & 

Farà che il command di ricerca venga forgiato e eseguito in background (puoi sempre ucciderlo con il suo PID).

perché eseguire un command di shell Linux con &?

Per get immediatamente il prompt e eseguire il process in background.

Qual è la loro function?

nohup consente al process di background di continuare a funzionare anche dopo che l'utente esce (o esce dalla shell iniziale).

> & reindirizza sia l'output standard che l'errore standard nel file di registro.

& gestisce tutta la cosa in background, dandovi immediatamente il tuo prompt.

Spiegazione:

Ogni process Linux apre tre canali I / O, un ingresso "stdin", un output standard "stdout" e un output di errore standard "stderr". Possono essere utilizzati per binari, ma sono tradizionalmente text. Quando la maggior parte dei programmi visualizza lo stdin, essi usciranno (questo può essere modificato dal programmatore).

Quando la shell padre esce, lo stdin è chiuso sui bambini e (spesso, di solito) anche i bambini usciranno. Inoltre, i bambini ricevono un segnale software, SIGHUP, che indica che l'utente ha "disinserito" (precedentemente il modem) e l'impostazione predefinita è anche quella di uscire. (Nota, un programmatore può cambiare tutto questo durante la scrittura del programma).

Quindi, che cosa fa nohup è dare al bambino il process di un ambiente di I / O separato, legando gli ingressi e le uscite a qualcosa non legato alla shell padre e schermando il figlio dal segnale SIGHUP. Una volta che l'utente si disconnette, vedrai il process di background nohup di properties; di init (process 1), non la shell dell'utente.

Tuttavia, nohup non può completare il lavoro se il process viene eseguito in primo piano, per cui viene utilizzato per eseguire il programma in background, where può essere felice di funzionare con o senza che un utente sia connesso.

Oltre alla risposta di Martin Martin: l'altro uso di ampersand ( >& come sopra) è quello di catturare sia stdout che stderr . Normalmente, se si reindirizza l'output a un file con solo '>', si otterrebbe solo l'output a stdout , mancando di eventuali errori.

Oltre alla risposta di Martin e Ash, a volte puoi vedere l'uso di un && token. Questo viene usato per dire "eseguire il secondo command se e solo se il primo command è stato eseguito correttamente". Un command ben scritto, se ha degli errori, non esiterà con successo.

 [[email protected] ~]$ ls file && echo removing file && rm file ls: file: No such file or directory [[email protected] ~]$ touch file [[email protected] ~]$ ls file && echo removing file && rm file file removing file [[email protected] ~]$ 

La risposta di Martin è buona, ma un po 'ambigua. Il command è sempre fork'ed e exec'ed, ma il normale comportmento delle shell è quello di attendere il command finché non esce. L'ampersand lo mette in background in modo da get il prompt del terminal e si può fare altre cose. Se il process sputa i dati a stdout o stderr, questo verrà mescolato a quello che stai facendo al prompt e può confondervi. Questo è il motivo per cui reindirizzi con> & / path / to /logfile.txt.

In risposta a George2, il comportmento normale di una shell che usciva è quello di submit il segnale SIGHUP a tutti i processi nello stesso gruppo di processi (essenzialmente roba che hai generato) e di solito si termineranno. Se si desidera continuare anche se si chiude il process di shell, è ansible utilizzare il command nohup per farli ignorare questo segnale e continuare a funzionare. C'è un nome speciale per questo tipo di process, si chiama un process daemon (pronunciato 'demone').