Sou relativamente novo no shell script, mas quase concluí um script que faz uso do programa lftp . A parte do script com a qual estou tendo problemas é quando crio uma longa sequência de comandos (separados por ;
).
for var in something
do
...
commands_to_run+="echo Result is `tail -n 1 $somefile`;"
done
O que estou notando é que o tail
programa - envolvido nos backticks - está sendo executado quando o loop for está repetindo, mas não quando invoco a sequência de comandos posteriormente no meu script.
Infelizmente, o conteúdo de $ somefile ainda não está pronto para ser inspecionado. Como posso executar o comando quando preciso, e não enquanto estou criando a string?
fonte
$(...)
como Hauke sugeriu, mas a barra invertida é a chave.eval
que você pode fazer a mesma coisa, não escapando de$
e usando aspas simples ('
) em vez de aspas duplas ("
) para cercar seu comando.echo
uma string com conteúdo, incluindo a saída de um comando aninhado de execução atrasada.echo
não vai funcionar porque não há nenhum comando paraeval
, mas uma string. Se você tem um exemplo mais pertinente para nós, podemos tentar ajudar.Existem vários níveis de cotação. Aspas (
"..."
) espaços em branco de proteção e vários caracteres especiais (~
,&
,|
,;
, ...), mas não impede expansão de parâmetros e substituição de comando.Você precisa de aspas simples (
'
) ou uma barra invertida na frente dos caracteres "perigosos".Em geral: você deve considerar usar, em
$(tail ...)
vez de backticks. Backticks são o padrão mais antigo, mas estamos falando de algo tão antigo que$()
não causa problemas para a maioria das pessoas. A nova versão é mais fácil de ler e pode ser aninhada. Muito menos os problemas de formatação aqui no sx ...fonte
$(...)
ainda produz o mesmo resultado - o shell executa isso quando minha string é definida.$()
mas precisa de aspas simples de qualquer maneira.