$ {1: + “$ @”} in / bin / sh

Ho notato che a volte gli script wrapper utilizzano ${1:+"[email protected]"} per i parametri anziché solo "[email protected]" .

Ad esempio, http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh utilizza

 exec "$binary" $opts ${1:+"[email protected]"} 

Qualcuno può rompere ${1:+"[email protected]"} in inglese e spiegare perché sarebbe un vantaggio rispetto a "[email protected]" ?

‘Uvetta isterica’, alias Reasons storico.

La spiegazione di JesperE (o della pagina man di Bash) è accurata per quello che fa:

Se $ 1 esiste e non è una stringa vuota, sostituire l’elenco quotato di argomenti.

Una volta circa 20 anni fa, alcune varianti secondarie rotti della Bourne Shell sostituirono una stringa vuota “” per “$ @” se non ci fossero argomenti, invece del corretto comportamento corrente di sostituire nulla. Se alcuni di questi sistemi siano ancora in uso è aperto al dibattito.

[Hmm: quell’espansione non funzionerebbe correttamente per:

 command '' arg2 arg3 ... 

In questo contesto, la notazione corretta è:

 ${1+"[email protected]"} 

Funziona correttamente se $ 1 è un argomento vuoto o no. Quindi, qualcuno ha ricordato la notazione in modo errato, introducendo accidentalmente un bug.]

Per citare la parte rilevante di man bash per le informazioni a cui Jonathan Leffler faceva riferimento nel suo commento:

Quando non si esegue l’espansione della sottostringa, i test di bash per un parametro non impostato o nullo ; omettendo i due punti si ottiene un test solo per un parametro non impostato .

(sottolineatura mia)

Dalla pagina man di bash:

  ${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. 

Quindi, "[email protected]" è sostituito a meno che $1 non sia impostato. Non riesco a capire perché non avrebbero potuto usare solo "[email protected]" .