Eu quero imprimir uma string e ter certeza de que todos os $VAR
s dentro dela não sejam expandidos para seus valores.
É por isso que coloco meu texto entre aspas simples.
Exemplo:
echo '$SHELL';read -sn 1
Este comando exibe $SHELL
não expandido e aguarda até que o usuário pressione qualquer tecla.
Agora vamos citar esta string e preceder com bash -c
:
bash -c 'echo '\''$SHELL'\'';read -sn 1'
Este comando faz exatamente o mesmo que o anterior.
Mais uma citação para obter a string final:
'bash -c '\''echo '\''\'\'\''$SHELL'\''\'\'\'';read -sn 1'\'
Preste atenção ao seguinte fato:
em cada etapa a subseqüência central $SHELL
é dentro de aspas simples , portanto, não pode ser expandida .
Agora vamos testar nossa string final:
Teste 1:
bash -c 'bash -c '\''echo '\''\'\'\''$SHELL'\''\'\'\'';read -sn 1'\'
Funciona bem: exibe $SHELL
não expandido e aguarda até que o usuário pressione qualquer tecla.
Teste 2:
gnome-terminal -e 'bash -c '\''echo '\''\'\'\''$SHELL'\''\'\'\'';read -sn 1'\'
Funciona bem: o $SHELL
não expandido é exibido dentro da nova janela do terminal.
Teste 3:
konsole -e 'bash -c '\''echo '\''\'\'\''$SHELL'\''\'\'\'';read -sn 1'\'
Este teste falha: /bin/bash
é exibido em vez de $SHELL
.
Perguntas:
1) Por que konsole
desobedece as regras de cotação?
2) Como passar uma string como parâmetro para konsole -e
e ter certeza de que ela não será expandida?
Editar :
O uso de strace
não deu nenhum resultado: sua saída não contém uma string executada pelo konsole.