A substituição de comando permite que a saída de um comando seja substituída no lugar do próprio nome do comando. A substituição do comando deve ocorrer quando o comando estiver entre os seguintes:
$(command)
ou (versão com aspas):
`command`
O shell deve expandir a substituição do comando executando o comando
em um ambiente de subcamação (consulte Ambiente de Execução do Shell ) e substituindo a substituição do comando (o texto do comando mais o "$ ()" ou aspas anexas) pela saída padrão do comando, removendo sequências de um ou mais <newline>
caracteres no final da substituição. embutido<newline>
Caracteres antes do final da saída não devem ser removidos; no entanto, eles podem ser tratados como delimitadores de campo e eliminados durante a divisão do campo, dependendo do valor do IFS e da citação que estiver em vigor. Se a saída contiver bytes nulos, o comportamento não será especificado.
No estilo de substituição de comando, com aspas retroativas, <backslash>
manterá seu significado literal, exceto quando seguido por: ' $
', ' `
' ou
<backslash>
. A pesquisa da cotação correspondente deve ser satisfeita pela primeira cotação não escapada sem aspas; durante esta pesquisa, se uma cotação não escapada for encontrada em um comentário do shell, um documento aqui, uma substituição de comando incorporada do formulário $ ( command ) ou uma sequência de caracteres citada, ocorrerão resultados indefinidos. Uma sequência de aspas simples ou aspas duplas que começa, mas não termina, na `...`
sequência " " produz resultados indefinidos.
Com o formulário $ ( comando ), todos os caracteres que seguem o parêntese aberto ao parêntese de fechamento correspondente constituem o
comando . Qualquer script de shell válido pode ser usado para comando , exceto um script que consiste apenas em redirecionamentos que produzem resultados não especificados.
Os resultados da substituição de comando não devem ser processados para expansão adicional de til, expansão de parâmetro, substituição de comando ou expansão aritmética. Se uma substituição de comando ocorrer entre aspas duplas, a divisão de campo e a expansão do nome do caminho não devem ser executadas nos resultados da substituição.
A substituição de comando pode ser aninhada. Para especificar o aninhamento na versão com aspas posteriores, o aplicativo deve preceder as aspas internas internas com <backslash>
caracteres; por exemplo:
\`command\`
A sintaxe da linguagem de comando do shell tem uma ambiguidade para expansões que começam com "$((
", que pode introduzir uma expansão aritmética ou uma substituição de comando que começa com um subshell. A expansão aritmética tem precedência; ou seja, o shell deve primeiro determinar se pode analisar a expansão como uma expansão aritmética e deve analisar apenas a expansão como um comando substituição se determinar que não pode analisar a expansão como uma expansão aritmética. O shell não precisa avaliar expansões aninhadas ao executar essa determinação. Se encontrar o final da entrada sem já ter determinado que não pode analisar a expansão como uma expansão aritmética, o shell O shell deve tratar a expansão como uma expansão aritmética incompleta e reportar um erro de sintaxe. Um aplicativo em conformidade deve garantir que ele separe "$(
" e '(
'em dois tokens (ou seja, separe-os com espaço em branco) em uma substituição de comando que começa com um subshell. Por exemplo, uma substituição de comando contendo um único subshell pode ser escrita como:
$( (command) )
$()
é POSIX e é suportado por todos os shells Bourne modernos, por exemplo, ksh, bash, ash, dash, zsh, busybox, você escolhe. (Um não tão moderno é o Solaris/bin/sh
, mas no Solaris você deve usar o moderno/usr/xpg4/bin/sh
).