O problema com seu código original é que a expressão de substituição de comando (denotada por back-ticks) é avaliada antes da execução do comando ssh
. Em uma situação diferente, você pode considerar citando a palavra-chave here-doc (por exemplo, "EOF") para evitar a expansão de parâmetros em seu aqui-doc, mas neste caso você realmente deseja executar alguma substituição de parâmetro no lado do cliente. Então, uma solução aqui poderia ser escapar da substituição de comando. Tente isso:
if [ \'gem list compass -i\' == 'false' ]
then
echo -e "Compass not installed... Installing it now."
gem install compass -V
fi
Os back-ticks evitados impedem que a substituição de comandos seja avaliada.
Eu também mencionarei que a sintaxe de back-tick para substituição de comandos é amplamente considerada como um recurso legado e que a sintaxe do sinal de dólar é geralmente preferida nos dias de hoje. Aqui está como o snippet acima ficaria com a sintaxe do sinal de dólar:
if [ \$(gem list compass -i) == 'false' ]
then
echo -e "Compass not installed... Installing it now."
gem install compass -V
fi
Para mais informações sobre as diferenças entre as duas notações, você pode consultar as seguintes postagens do StackExchange:
-
O que é o benefício de usar $ () em vez de backticks em scripts de shell?
-
Têm backticks (ou seja,
cmd
) nas shells * sh foram preteridas?
Você também pode querer olhar para a página de manual do GNU Bash sobre a substituição de comandos .
E também na página de manual do GNU Bash sobre redirecionamento .
Observe, em particular, a seguinte subseção aqui:
3.6.6 Here Documents
This type of redirection instructs the shell to read input from the current source until a line containing only word (with no trailing blanks) is seen. All of the lines read up to that point are then used as the standard input (or file descriptor n if n is specified) for a command.
The format of here-documents is:
[n]<<[-]word here-document delimiter
No parameter and variable expansion, command substitution, arithmetic expansion, or filename expansion is performed on word. If any part of word is quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the character sequence \newline is ignored, and ‘\’ must be used to quote the characters ‘\’, ‘$’, and ‘'’.
If the redirection operator is ‘<<-’, then all leading tab characters are stripped from input lines and the line containing delimiter. This allows here-documents within shell scripts to be indented in a natural fashion.