Perché uscire con un codice di ritorno memorizzato di un comando nidificato provoca diversi codici di ritorno in Dash e Bash?


8

In esecuzione

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

risulta test1essere stampato su console e echo $?stampare ciò 1che a mio avviso è corretto, perché il comando dovrebbe tornare con ciò [b/d]ash -cche è stato restituito dall'interno

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

produce lo stesso output, ma ritorna con 0secondo echo $?.

Mi piacerebbe capire questa differenza per ampliare la mia comprensione delle shell e della programmazione delle shell portatili.

Sto usando bash4.4.12 e dash0.5.8-2.3ubuntu1 su Ubuntu 17.10 (Artful Aardvark).

Risposte:


20

&>non è in POSIX e non è supportato da dash. Viene analizzato come & >, quindi il comando è invece in background. Ai comandi in background viene assegnato uno stato di uscita pari a zero dal punto di vista del genitore, poiché non sono usciti dal momento in cui hai letto $ ?.

Questo è anche il motivo per cui (almeno per me) l' test1output " " appare nel mio prompt, al termine del comando.

Bash's &> fooè equivalente a> foo 2>&1 , e uno script portatile dovrebbe usare quest'ultimo.


5
&>è in POSIX. Questo è &seguito da >. In foo &> bar, questo foo &deve iniziare fooin background ed > bareseguire un reindirizzamento senza un comando. bashnon è conforme a POSIX quando lo interpreta in modo diverso.
Stéphane Chazelas,

4
Abbastanza interessante è che questo non è stato menzionato in wiki.ubuntu.com/DashAsBinSh Mi sono preso la libertà di modificare la pagina e includerlo
Sergiy Kolodyazhnyy
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.