Como posso dizer ao bash top para parar de ecoar o texto sempre que pressiono qualquer tecla?

Como posso dizer ao bash top para parar de ecoar o texto sempre que pressiono qualquer tecla?

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 sudiretamente. 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 -cse 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;'

informação relacionada