Como posso dizer ao bash top stop ecoar o texto sempre que pressiono qualquer tecla?

1

Estou escrevendo um comando de inicialização personalizado para o gnome-terminal e minha intenção é exibir uma mensagem de boas-vindas toda vez que eu iniciá-lo.

A mensagem é exibida corretamente, eu a codifiquei para fazer as letras aparecerem uma por 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 

Durante o teste, achei que seria bastante confortável impedir que as letras aparecessem e inicie su diretamente. Eu criei 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 eu não quiser que o bash fique bravo e jogue um 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 em que escrevo meu comando personalizado para inicialização). O Bash retorna:

No passwd entry for user 'Successful.; else echo Test'
Welcome

Misteriosamente, quando eu tento o mesmo comando (sem su -c ) no perfil padrão ele funciona perfeitamente, mas se eu tentar com su -c, não funciona.

Experimentando com outros comandos no perfil padrão, digitei su -c "echo Hi" e funcionou bem. Por que isso poderia estar acontecendo? Você tem alguma ideia?

    
por xvlaze 28.01.2016 / 19:49

1 resposta

1

Coloque o comando inteiro entre aspas simples, em vez de duplas. A primeira coisa a notar é que você tem uma variável (tecla $). Entre aspas duplas, ele será substituído pelo shell antes de torná-lo um argumento dado a su . A segunda coisa é sobre a correspondência de cotações 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 os argumentos inteiros entre aspas simples permite corrigir os dois problemas, evitar a substituição de variáveis e corrigir a estranheza da divisão, passando essa cadeia como está como o segundo argumento de su .

Bônus: como uma observação geral, evite colchetes duplos para testes quando possível, é uma base (sintaxe que só funciona com o bash e pode ser substituída por uma parte do contador mais compatível)

A versão a seguir deve funcionar como esperado.

su --command 'read -n 1 -s key; if [ "$key" == "g" ]; then echo "Test Successful."; else echo "Test Failed."; fi;'
    
por 29.01.2016 / 05:24