Este é um pouco complicado. A informação que Hauke forneceu está correta, é apenas uma questão de analisá-la para o seu caso de uso.
A maneira mais fácil é usar a sintaxe $()
ao escapar do $
, de modo que a definição da variável não execute o comando delimitado pelo $()
no momento da definição. A ressalva é que o resultado final deve ser reavaliado (via eval
) pelo shell no momento da execução real para o comando aninhado executar.
É muito mais fácil analisar um exemplo, por isso, tome este, o que deve colocá-lo no caminho certo:
for((i=0;i<10;i++)); do
date +%s.%N # Print a timestamp (in format seconds.nanoseconds)
test="echo \$(date +%s.%N)" # Save a command to do the same
sleep 1 # Sleep for a second
eval "$test" # Evaluate the command saved in variable 'test'
echo # Print a new line before the next iteration
done
Veja a saída de amostra do exemplo acima (aparada em uma iteração):
1398832186.133661344
1398832187.139076728
Você notará que o segundo timestamp de cada loop é de cerca de um segundo após o primeiro. Por outro lado, se você realizar o mesmo teste sem escapar do $
na definição test
e remover o eval
, os dois carimbos de data / hora quase corresponderão.
Não adquira o hábito de usar eval
na maioria das situações, mas esse é um daqueles em que não sei como evitá-lo. Espero que isso ajude. Boa sorte!