Espero que este comando imprima um valor aleatório na tela a cada 2 segundos, mas, em vez disso, não imprime nada:
watch bash -c '"echo $RANDOM"'
Este comando, no entanto, imprime um valor aleatório a cada 2 segundos:
watch bash -c '"echo \$RANDOM"'
Aparentemente eu tenho que escapar do cifrão, mas gostaria de entender o porquê, porque no primeiro caso o comando watch informa no topo estar executando o comando corretamente:
Every 2.0s: bash -c "echo $RANDOM"
No segundo caso relata estar executando este comando, conforme esperado:
Every 2.0s: bash -c "echo \$RANDOM"
Ok, entendi, o cifrão tem que ser escapado para alcançar o comando bash corretamente. Mas ainda assim, por quê? O que o comando watch faz com $ RANDOM antes de executar o comando para que ele não produza nada?
Como @steeldriver mencionado em um comentário, por padrão
watch
executa o comando através dosh -c
. Parece juntar todos os argumentos que obtém com espaços primeiro, no entanto.Com
ele obtém os argumentos
bash
,-c
,"echo $RANDOM"
, produzbash -c "echo $RANDOM"
e é executadosh
com os dois argumentos-c
ebash -c "echo $RANDOM"
.Em seguida
sh
, uma variável entre aspas duplas e a expande devidamente. Se o seush
não suporta o special$RANDOM
, a variável inteira provavelmente não está definida e você obtém uma string vazia lá. Em seguida, o comando resultante ébash -c "echo "
, que inicia o Bash, informando-o para imprimir apenas uma nova linha.(Se o seu
sh
é Bash e tem$RANDOM
, então você poderia ter usado apenaswatch 'echo $RANDOM'
.)Se você adicionar a barra invertida, o shell externo (
sh
) verá... "echo \$RANDOM"
, que não se expande, mas apenas remove a barra invertida. O shell interno (bash
) vêecho $RANDOM
e expande a própria variável. O mesmo se você organizar o shell externo para obter... 'echo $RANDOM'
, com aspas simples.Você pode ver a expansão que o shell intermediário faz com algo assim (ele deve imprimir
out
):Com
watch -x
, ele pularia o shell intermediário e isso funcionaria da maneira que você espera sem o inferno das citações:Da página man :
Se você executar
echo $RANDOM
usingsh
em vez debash
você não obterá nenhuma saída porque$RANDOM
está disponível embash
, mas não emsh
.