¿Cómo puedo decirle a bash top que deje de hacer eco del texto cada vez que presiono cualquier tecla?

¿Cómo puedo decirle a bash top que deje de hacer eco del texto cada vez que presiono cualquier tecla?

Estoy escribiendo un comando de inicio personalizado para gnome-terminal y mi intención es mostrar un mensaje de bienvenida cada vez que lo ejecuto.

El mensaje se muestra correctamente, lo codifiqué para que las letras aparezcan una por una en un tiempo de 0,09 s:

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 

Mientras lo probaba pensé que sería bastante cómodo poder detener la aparición de letras y empezar sudirectamente. Se me ocurrió la siguiente solución:

su --command "read -n 1 -s key; if [[ "$key" == "g" ]]; then echo "Test Successful."; else echo "Test Failed."; fi;"

Tengo que usarlo su -csi no quiero que bash se enoje y lance un archivo illegal action: read -n. Este fragmento de código es exclusivamente para fines de depuración, ya que quería probar cómo lee bash la combinación de comandos de una línea.

El principal problema surge cuando intento ejecutar este código desde el archivo de configuración (aquel donde escribo mi comando personalizado para el inicio). Bash devuelve:

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

Misteriosamente, cuando intento el mismo comando (sin su -c) en el perfil predeterminado funciona perfectamente, pero si lo intento con su -c, no funciona.

Probando con otros comandos en el perfil predeterminado, escribí su -c "echo Hi"y funcionó bien. ¿Por qué podría estar pasando esto? ¿Tiene alguna idea?

Respuesta1

Encierre todo el comando entre comillas simples en lugar de dobles. Lo primero que hay que tener en cuenta es que tiene una variable ($key). Entre comillas dobles, el shell lo sustituirá antes de convertirlo en un argumento dado a su. Lo segundo es con respecto a las comillas que coinciden con lo que tiene actualmente, con comillas dobles, el argumento se dividirá así:

  • 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;

Encerrar todos los argumentos entre comillas simples permite solucionar los dos problemas, evitar la sustitución de variables y corregir la rareza de la división, al pasar esta cadena tal cual como segundo argumento de su.

Bonificación: como nota general, evite los corchetes dobles para las pruebas cuando sea posible, es un bashismo (sintaxis que solo funciona con bash y podría reemplazarse por una contraparte más compatible)

La siguiente versión debería funcionar como se esperaba.

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

información relacionada