O que significa “se $” em se $ (ssh usuario @ host “[-e arquivo]”); então …?

2

Eu vi o script em que a condição em uma instrução if usou $ e eu não entendo por quê?

if $( ssh user@host " test -e file  " ); then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi
    
por avsun 19.06.2015 / 14:01

3 respostas

12

$(...) é uma substituição de comando. O shell executa o comando fechado e a expressão é substituída pela saída padrão do comando.

Geralmente, isso produziria um erro se o texto de substituição não nomeasse um comando que o shell pudesse executar. No entanto, test não produz saída, portanto, o resultado é uma cadeia vazia que o shell "pula". Por exemplo, considere o que acontece se você executar

if $( ssh user@host " echo foo " ); then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi

O código fornecido está escrito corretamente sem a substituição desnecessária do comando; a única coisa que a instrução if precisa é o status de saída do comando.

if ssh user@host "test -e file"; then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi
    
por 19.06.2015 / 14:23
6

A construção $( ... ) executa um comando e retorna o status de saída do comando junto com sua saída como uma string. É uma versão mais moderna de backticks '...' .

Pode ser usado assim: my_id=$(id)

O snippet que você publicou é um código quebrado. Ele usa o resultado de ssh user@host "test -f file" , que parece retornar um booleano baseado na existência do arquivo no host remoto. Infelizmente, ele não leva em conta que o ssh pode falhar:

if $(ssh -q localhost true); then echo YES; else echo NO; fi
YES

if $(ssh -q localhost false); then echo YES; else echo NO; fi
NO

if $(ssh -q nowhere true); then echo YES; else echo NO; fi
ssh: Could not resolve hostname nowhere: Name or service not known
NO

Talvez este seja o comportamento pretendido, mas suspeito que não.

Além disso, o $( ... ) é redundante e a condição pode ser melhor expressa diretamente:

if ssh -q user@host "test -e file"; then 
   echo "File is there"
else
   echo "We don't [see] that file on that host [or the ssh failed]"
fi
    
por 19.06.2015 / 14:27
3

O $(command) é chamado de substituição de comando (consulte as especificações do POSIX aqui e o manual da festa aqui ). É uma maneira de executar um comando e passar sua saída para outro. É equivalente a 'command' , mas a sintaxe $(...) é preferida, pois é mais fácil aninhar comandos e resulta em código mais legível.

Por exemplo:

$ echo $(echo "bar")
bar

O comando acima passou a saída de echo "bar" (que é bar ) para o exterior echo .

    
por 19.06.2015 / 14:29