Vedi i seguenti esempi e i loro output nelle shell POSIX:
false;echo $?
oppurefalse || echo 1
:1
false;foo="bar";echo $?
oppurefoo="bar" && echo 0
:0
foo=$(false);echo $?
oppurefoo=$(false) || echo 1
:1
foo=$(true);echo $?
oppurefoo=$(true) && echo 0
:0
Come menzionato dalla risposta più votata su /programming/6834487/what-is-the-variable-in-shell-scripting :
$?
viene utilizzato per trovare il valore restituito dell'ultimo comando eseguito.
Questo è probabilmente un po 'fuorviante in questo caso, quindi otteniamo la definizione POSIX che è anche citata in un post da quel thread:
? Si espande allo stato di uscita decimale della pipeline più recente (consultare Pipeline).
Quindi sembra che un compito stesso valga come un comando (o piuttosto una parte della pipeline) con un valore di uscita pari a zero ma che si applica prima del lato destro dell'assegnazione (ad esempio, la sostituzione del comando chiama i miei esempi qui).
Vedo come questo comportamento abbia senso dal punto di vista pratico, ma mi sembra in qualche modo insolito che il compito stesso contasse in quell'ordine. Forse per chiarire perché è strano per me, supponiamo che il compito sia una funzione:
ASSIGNMENT( VARIABLE, VALUE )
allora foo="bar"
sarebbe
ASSIGNMENT( "foo", "bar" )
e foo=$(false)
sarebbe qualcosa di simile
ASSIGNMENT( "foo", EXECUTE( "false" ) )
il che significherebbe che EXECUTE
viene eseguito prima e solo dopo ASSIGNMENT
viene eseguito, ma è ancora lo EXECUTE
stato che conta qui.
Sono corretto nella mia valutazione o sto fraintendendo / mancando qualcosa? Sono questi i motivi giusti per me considerare questo comportamento "strano"?
false;foo="bar";echo $?
restituisce sempre 0 quando è stato l'ultimo vero comando eseguito false
?" Fondamentalmente, i compiti si comportano in modo speciale quando si tratta di codici di uscita. Il loro codice di uscita è sempre 0, tranne quando non è dovuto a qualcosa che è stato eseguito come parte del lato destro del compito.