2013-06-01 10 views
8

Sommario: Ho uno script di bash che esegue un processo in background e che dovrebbe funzionare come un normale comando e all'interno di un blocco di sostituzione di comandi come come $(...). Lo script stesso genera un processo che si inserisce in background. Può essere ridotto a questo banco di prova:

#!/bin/sh 
echo something 
sleep 5 & 

esecuzione di questo script in una shell restituirà immediatamente (e di stampa "qualcosa"), in esecuzione all'interno $(...) si bloccherà per 5 secondi, in attesa che il "sonno" in background finire.

Si applica a tutto ciò che viene avviato all'interno della shell di sostituzione comandi e genera i processi in background, inclusi eventuali figli in tale albero del processo apparentemente. Sembra influenzare sia bash che zsh, non ho provato altri.


domanda originale: Ho uno script bash che dovrebbe stampare un valore stdout ed inoltre copiare negli appunti X ogni volta che viene eseguito.

#!/bin/sh 
echo something 
echo something | xclip -selection clipboard 

Questo script (chiamiamolo "qualcosa") è destinato a essere utilizzato per ottenere questa parola (che in realtà è l'output di un altro comando) e possono essere usate in modi diversi, come:

$ something 
something 
$ xclip -o -selection clipboard 
something 
$ echo $(something) 
^C 

Stampa sullo stdout normale, copia l'output negli appunti da utilizzare nelle normali applicazioni X e dovrebbe anche essere in grado di utilizzare lo stdout con la sostituzione di comando bash, per inserire questa parola nel mezzo di qualsiasi comando.

Tuttavia la sostituzione del comando bash sembra forzare xclip per rimanere in vita in primo piano. xclip normalmente si demone da solo poiché gli appunti X richiedono che un client fornisca il contenuto degli appunti e il comportamento predefinito è di farlo uscire una volta sostituito il contenuto degli appunti.

Dopo avere questo problema con XRITAGLIA ho fatto il banco di prova minimo che ho scritto all'inizio di questa domanda, così sembra applicare che tutto ciò che daemonizes all'interno del guscio $(...)

Qualcuno può spiegare questo comportamento? C'è un modo per evitarlo?

risposta

12

Se si desidera che il processo in background non interferisca con la sostituzione di comando, è necessario disconnetterne lo stdout. Ciò restituirà immediatamente:

$ cat bg.sh 
#!/bin/sh 
echo before 
sleep 5 >/dev/null & 
echo after 
$ date; x=$(./bg.sh); date; echo "$x" 
Sat Jun 1 13:02:26 EDT 2013 
Sat Jun 1 13:02:26 EDT 2013 
before 
after 

si perde la capacità di catturare stdout del processo in background, ma se si sta eseguendo in background che probabilmente non si cura. il processo bg.sh può sempre scrivere sul disco.

+0

Woo! Soluzione perfetta ed estremamente semplice. Grazie! – dequis

+0

A proposito, il reindirizzamento a un file anziché a/dev/null sembra funzionare per acquisire l'output, ma almeno qui, il file di output sembra essere aggiornato solo dopo l'uscita del processo in background. (Non ne ho bisogno per questo, però) – dequis

Problemi correlati