Criei alguns ambientes de servidor com Ubuntu e Bash, em provedores de hospedagem "shell autogerenciados" como DigitialOcean, nos quais executei aplicativos Drupal/WordPress.
Durante todo esse tempo não tive a necessidade de usar o que se chama de " substituição de comando ".
Eu pergunto, qual será um problema, um "padrão" no qual um programador Bash teria que usar esse conceito? Por favor, dê um exemplo?
Substituição de comando significa executar um comando shell e armazenar sua saída em uma variável ou exibir de volta usando o comando echo. Por exemplo, exibir data e hora:
É útil em situações em que meu comando recebe como parâmetro a saída de outro comando ou exemplo.
Da subseção de substituição de comando no padrão POSIX :
As substituições de comandos permitem uma maneira prática de usar a saída de um comando sem a necessidade de primeiro gravá-lo em um arquivo temporário e depois lê-lo desse arquivo. Isso é feito melhor se a saída do comando for uma string curta em uma única linha.
Algumas pessoas usam substituições de comando para coletar a saída de um comando, mesmo que a quantidade de saída possa ser um documento de várias linhas. Geralmente, essa não é uma boa maneira de usar a substituição de comandos. Em vez disso, o idioma padrão do Unix de passar dados entre estágios de processamento usando pipelines ou arquivos temporários deve ser usado.
Exemplos de substituições de comandos que eu uso:
Por exemplo, para descobrir se o usuário atual está executando o script como root:
A substituição do
$(id -u)
comando será substituída pela saída deid -u
, que retornará o UID (um inteiro) do usuário atual.Outro exemplo. Estou usando o GnuPG para assinar
git
commits. Para que o GnuPG funcione corretamente, preciso definirGPG_TTY
o nome do dispositivo terminal atual no arquivo de inicialização do meu shell interativo. eu faço isso comIsso define
GPG_TTY
algo como/dev/ttyp4
dependendo do dispositivo de terminal atual na sessão do shell.Outro exemplo. Eu tenho um script que deve tratar a execução em uma máquina Solaris como um caso especial:
Outro exemplo. O
getconf PATH
comando retorna o "caminho padrão" para o sistema atual. Eu o uso em algumas circunstâncias para redefinir aPATH
variável para um valor "padrão sã":Eu uso
find
muito, como:Além disso, como parte do IDE de um homem pobre:
Os exemplos acima são de linha de comando. Eu também uso muito em scripts, e seria difícil sem ele. O caso mais comum é provavelmente o mencionado acima, para definir variáveis de shell a partir da saída de um comando:
Eu uso aspas invertidas por hábito antigo, mas a
$(command)
sintaxe é muito melhor, pois você pode incorporar uma dentro da outra. Com as aspas, você precisa saber exatamente onde colocar os\
caracteres de escape e é um incômodo.Outro exemplo:
No Docker, você pode limpar contêineres parados usando:
Você também pode obter os ids dos contêineres que pararam de funcionar com:
Assim, você pode limpar todos os contêineres parados com:
... onde os ids produzidos por
docker ps
são substituídos pela$(docker ps...)
string a ser usada pelodocker rm
comando.O padrão de implementação que torna esse uso necessário é que os shells Unix executem cada comando não interno em um processo filho. O processo filho não pode modificar o contexto de seu pai. A substituição de comandos pode fazer com que o shell use a saída textual de um comando não integrado como se tivesse sido escrito no script de shell ou digitado na linha de comando.