O que é esta variável de formulário = $ (…)

9

O que significa o seguinte:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

Estou particularmente interessado nesta parte:

varible=$(...)

Sei que parênteses são usados ​​para executar um subprocesso, mas e se forem usados ​​junto $?

Maxim Koretskyi
fonte
3
Se você estiver usando bash: Olhe para o homem páginas via man bashe procurar substituição de comando
Flohe

Respostas:

16

No manual do Bash ( man bash):

   Substituição de Comando
       A substituição de comando permite que a saída de um comando substitua o
       nome do comando Existem duas formas:

              $ (comando)
       ou
              `comando`

       O Bash executa a expansão executando o comando em um subshell
       ambiente e substituindo a substituição de comando pelo padrão
       saída do comando, com as novas linhas finais excluídas. embutido
       novas linhas não são excluídas, mas podem ser removidas durante a palavra
       dividindo. A substituição do comando $ (arquivo cat) pode ser substituída pelo
       equivalente, mas mais rápido, $ (<arquivo).

(Isto é válido para todos Bourne-como conchas, ou seja sh, ksh, zsh, bashetc., e zshtambém é capaz de capturar dados com caracteres NUL incorporados desta forma)

O comando

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

irá atribuir o nome do diretório onde o script está localizado (ao mesmo tempo, mudando todas as barras invertidas em barras) para a variável basedir. Quaisquer erros, avisos ou outras mensagens de diagnóstico enviadas para o fluxo de erros padrão ainda serão exibidos no terminal ( $(...)apenas captura a saída padrão do comando).

O shell começará executando a substituição do comando mais interno:

echo "$0" | sed -e 's,\\,/,g'

A saída disso será fornecida como uma string dirnamee a saída será atribuída à variável basedir.

As aspas duplas existem para garantir que nenhuma divisão de palavras ou globbing de nome de arquivo seja realizada; caso contrário, você pode achar que o script falha ou produz uma saída estranha quando $0(o nome do script, incluindo o caminho usado para executá-lo) contém um espaço caractere ou um caractere globbing do nome do arquivo (como ?ou *).

Em geral, é uma boa ideia sempre citar expansões (expansões variáveis, substituições de comandos e expansões aritméticas). Veja esta pergunta e suas respostas para uma excelente explicação sobre por que essa é uma boa ideia.

Se o script foi executado como

$ /usr/local/bin/script.sh

então basedirobterá o valor de /usr/local/bin.

Ou, no Cygwin:

$ bash c:\\Users\\Me\\script.sh

então basedirobterá o valor de c:/Users/Me. As barras invertidas duplas na linha de comando, neste caso, são apenas para escapar das barras invertidas únicas do shell. O valor real de $0é c:\Users\Me\script.sh.

Outra maneira de fazer a mesma coisa sem usar dirname, echoe sedseria

basedir="${0//\\//}"
basedir="${basedir%/*}"
Kusalananda
fonte
obrigado, então basicamente começa a analisar a partir do parêntese mais interno, correto? e por que as aspas são usadas?
Maxim Koretskyi
@Maximus Correct. Atualizei minha resposta com mais informações.
Kusalananda
Talvez você deva dizer "vale para todas as conchas do tipo Bourne". Um pouco mais claro assim
Sergiy Kolodyazhnyy 21/01
@Erg, observe que o shell Bourne (como o /bin/shdo Solaris 10 ou anterior) não suportava $(...).
Stéphane Chazelas
@ StéphaneChazelas Vou incorporar isso.
Kusalananda
6

Significa executar o que está entre parênteses em um subshell e retornar isso como um valor , no seu caso, atribuindo isso a varible.

marc
fonte