O que é $ () em um comando?

18

O que há $()nos comandos de shell do Linux?

Por exemplo:

chmod 777 $(pwd)
Sudoer
fonte
11
Observe que não existe o comando shell de linha . Existem vários aplicativos de shell disponíveis para Linux.
Stéphane Chazelas

Respostas:

21

É muito parecido com os backticks ``.

É chamado substituição de comando ( especificação posix ) e invoca um subshell. O comando entre chaves $()ou entre os backticks (``) é executado em um subshell e a saída é então colocada no comando original.

Ao contrário dos backticks, o $(...)formulário pode ser aninhado. Portanto, você pode usar a substituição de comandos dentro de outra substituição.

Existem também diferenças nos caracteres de escape na substituição. Eu prefiro o $(...)formulário.

caos
fonte
4
os backticks também podem ser aninhados. Observe que os caracteres de nova linha à direita são removidos da saída do comando.
Stéphane Chazelas
2
@ StéphaneChazelas como os backticks podem ser aninhados? Você quer dizer escapada ecxessiva?
caos
3
Sim: como comecho `echo \`echo foo\`` bar
Stéphane Chazelas
11
Alguma referência oficial dizendo que os backticks estão obsoletos?
vinc17
11
Encontrou esta resposta: unix.stackexchange.com/questions/126927/… parece que não foi preterido. Mudou a minha resposta, graças
caos
5

Em POSIX ou POSIX-como conchas ( ksh, bash, ash, zsh, yash...), é como ``: o interior de comando $()é executado e substituído por sua saída padrão. A divisão de palavras e a geração de nome de arquivo são feitas, a menos que haja $()aspas duplas. portanto

chmod 777 $(pwd)

deve ser substituído por:

chmod 777 "$(pwd)"

para evitar a divisão de palavras e a geração de nome de arquivo no caminho atual do diretório de trabalho.

Ou melhor ainda (exceto em alguns shells, como zsh, caso o diretório tenha sido renomeado):

chmod 777 "$PWD"

Since $PWDé uma variável especial que mantém o caminho para o diretório de trabalho atual nos shells POSIX.

Ou melhor ainda:

chmod 777 .

Como a .entrada no diretório atual é um link direto para o próprio diretório.

vinc17
fonte
2

Isso $()é usado para executar um comando principalmente dentro de algum outro comando.

chmod 777 $(pwd)

pwdO comando fornece o diretório de trabalho atual. Portanto, quando tudo é executado, a saída do pwd substitui sua posição e serve como argumento para chmod, e o resultado é que todo o seu diretório de trabalho atual recebe a permissão 777que eu acho que nunca deve ser usada no ambiente de produção;).

iniciante
fonte