Estou escrevendo um comando de inicialização personalizado para o gnome-terminal e minha intenção é exibir uma mensagem de boas-vindas sempre que eu iniciá-lo.
A mensagem é exibida corretamente, codifiquei-a para que as letras aparecessem uma a uma em uma taxa de tempo de 0,09s:
echo -n "W"
sleep 0.09
echo -n "e"
sleep 0.09
echo -n "l"
sleep 0.09
echo -n "c"
sleep 0.09
echo -n "o"
sleep 0.09
echo -n "m"
sleep 0.09
echo -n "e"
sleep 0.09
Ao testá-lo, pensei que seria bastante confortável poder impedir o aparecimento das letras e iniciar su
diretamente. Eu encontrei a seguinte solução:
su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"
Eu tenho que usar su -c
se não quiser que o bash fique com raiva e jogue um arquivo illegal action: read -n
. Este trecho de código é exclusivamente para fins de depuração, pois eu queria testar como o bash lê a combinação de comandos de uma linha.
O principal problema surge quando tento executar este código a partir do arquivo de configuração (aquele onde escrevo meu comando personalizado para inicialização). Bash retorna:
No passwd entry for user 'Successful.; else echo Test'
Welcome
Misteriosamente, quando tento o mesmo comando (sem su -c
) no perfil padrão, ele funciona perfeitamente, mas se eu tentar com su -c, isso não acontece.
Tentando outros comandos no perfil padrão, digitei su -c "echo Hi"
e funcionou bem. Por que isso poderia estar acontecendo? Você tem alguma ideia?
Responder1
Coloque todo o comando entre aspas simples em vez de duplas. A primeira coisa a notar é que você tem uma variável ($key). Colocado entre aspas duplas, será substituído pelo shell antes de torná-lo um argumento dado a su
. A segunda coisa é em relação à correspondência entre aspas e o que você tem atualmente, com aspas duplas, o argumento será dividido assim:
- arg0:
su
- arg1:
--command
- arg2:
read -n 1 -s key; if [ <value of $key or nothing> == g ]; then echo Test
- arg3:
Successful.; else echo Test
- arg4:
Failed.; fi;
Colocar todos os argumentos entre aspas simples permite corrigir os dois problemas, evitar a substituição de variáveis e corrigir a estranheza da divisão, passando essa string como está como o segundo argumento de su
.
Bônus: como observação geral, evite colchetes duplos para testes quando possível, é um bashismo (sintaxe que só funciona com bash e pode ser substituída por uma contraparte mais compatível)
A versão a seguir deve funcionar conforme o esperado.
su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'