La sostituzione dei comandi consente di sostituire l'output di un comando al posto del nome del comando stesso. La sostituzione del comando deve avvenire quando il comando è racchiuso come segue:
$(command)
o (versione retroquotata):
`command`
La shell espande la sostituzione del comando eseguendo il comando
in un ambiente subshell (consultare Shell Execution Environment ) e sostituendo la sostituzione del comando (il testo del comando più il "$ ()" o backquotes racchiuso) con l'output standard del comando, rimuovendo sequenze di uno o più <newline>
caratteri alla fine della sostituzione. I <newline>
caratteri incorporati prima della fine dell'output non devono essere rimossi; tuttavia, possono essere trattati come delimitatori di campo ed eliminati durante la divisione del campo, a seconda del valore di IFS e delle quotazioni in vigore. Se l'output contiene byte nulli, il comportamento non è specificato.
All'interno dello stile di sostituzione del comando retroquadrato, <backslash>
deve conservare il suo significato letterale, tranne se seguito da: ' $
', ' `
' o
<backslash>
. La ricerca del backquote corrispondente deve essere soddisfatta dal primo backquote non quotato senza escape; durante questa ricerca, se si incontra un backquote senza escape all'interno di un commento della shell, un documento qui, una sostituzione di comando incorporata del modulo $ ( comando ) o una stringa tra virgolette, si verificano risultati indefiniti. Una stringa tra virgolette singole o doppie che inizia, ma non termina, all'interno della `...`
sequenza " " produce risultati indefiniti.
Con il modulo $ ( comando ), tutti i caratteri che seguono la parentesi aperta alla parentesi di chiusura corrispondente costituiscono il
comando . È possibile utilizzare qualsiasi script shell valido per il comando , ad eccezione di uno script costituito esclusivamente da reindirizzamenti che produce risultati non specificati.
I risultati della sostituzione dei comandi non devono essere elaborati per un'ulteriore espansione della tilde, espansione dei parametri, sostituzione dei comandi o espansione aritmetica. Se si verifica una sostituzione di comando tra virgolette doppie, la divisione dei campi e l'espansione del percorso non devono essere eseguite sui risultati della sostituzione.
La sostituzione dei comandi può essere nidificata. Per specificare l'annidamento all'interno della versione retroquotata, l'applicazione deve precedere i backquotes interni con <backslash>
caratteri; per esempio:
\`command\`
La sintassi del linguaggio dei comandi della shell ha un'ambiguità per le espansioni che iniziano con "$((
", che può introdurre un'espansione aritmetica o una sostituzione di comando che inizia con una subshell. L'espansione aritmetica ha la precedenza; vale a dire, la shell deve prima determinare se può analizzare l'espansione come espansione aritmetica e deve solo analizzare l'espansione come comando sostituzione se determina che non può analizzare l'espansione come espansione aritmetica. La shell non ha bisogno di valutare espansioni nidificate quando esegue questa determinazione. Se incontra la fine dell'input senza aver già determinato che non può analizzare l'espansione come espansione aritmetica, il shell considera l'espansione come un'espansione aritmetica incompleta e segnala un errore di sintassi. Un'applicazione conforme deve garantire che separa " $(
" e "(
'in due token (ovvero, separarli con uno spazio bianco) in una sostituzione di comando che inizia con una subshell. Ad esempio, una sostituzione di comando contenente una singola subshell potrebbe essere scritta come:
$( (command) )
$()
è POSIX e supportato da tutte le moderne shell Bourne, ad esempio ksh, bash, ash, dash, zsh, busybox, lo chiami. (Uno non così moderno è Solaris/bin/sh
, ma su Solaris ti assicureresti di usare/usr/xpg4/bin/sh
invece il moderno ).