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?
Woo! Soluzione perfetta ed estremamente semplice. Grazie! – dequis
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