Wie kann ich Bash dazu bringen, die Textwiederholung zu beenden, wenn ich eine beliebige Taste drücke?

Wie kann ich Bash dazu bringen, die Textwiederholung zu beenden, wenn ich eine beliebige Taste drücke?

Ich schreibe einen benutzerdefinierten Startbefehl für das Gnome-Terminal und möchte bei jedem Start eine Willkommensnachricht anzeigen.

Die Nachricht wird korrekt angezeigt. Ich habe sie so codiert, dass die Buchstaben nacheinander im Abstand von 0,09 Sekunden erscheinen:

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 

Beim Testen fand ich es ganz praktisch, wenn man die Buchstaben anhalten und sudirekt loslegen könnte. Ich bin auf folgende Lösung gekommen:

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

Ich muss verwenden, su -cwenn ich nicht möchte, dass Bash wütend wird und ein ausgibt illegal action: read -n. Dieser Codeausschnitt dient ausschließlich zu Debugzwecken, da ich testen wollte, wie Bash die einzeilige Befehlskombination liest.

Das Hauptproblem tritt auf, wenn ich versuche, diesen Code aus der Konfigurationsdatei auszuführen (in der ich meinen benutzerdefinierten Befehl zum Start schreibe). Bash gibt Folgendes zurück:

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

Auf mysteriöse Weise funktioniert es einwandfrei, wenn ich denselben Befehl (ohne su -c) im Standardprofil versuche. Wenn ich es jedoch mit su -c versuche, funktioniert es nicht.

Beim Versuch mit anderen Befehlen im Standardprofil su -c "echo Hi"funktionierte alles einwandfrei. Warum kann das passieren? Haben Sie eine Idee?

Antwort1

Setzen Sie den gesamten Befehl in einfache Anführungszeichen statt in doppelte. Als Erstes müssen Sie beachten, dass Sie eine Variable ($key) haben. In doppelte Anführungszeichen eingeschlossen wird sie von der Shell ersetzt, bevor sie als Argument an übergeben wird su. Zweitens müssen die Anführungszeichen mit dem übereinstimmen, was Sie gerade haben. Mit doppelten Anführungszeichen wird das Argument folgendermaßen aufgeteilt:

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

Durch das Einschließen der gesamten Argumente in einfache Anführungszeichen werden die beiden Probleme behoben, Variablensubstitution vermieden und die Split-Merkwürdigkeit behoben, indem dieser String unverändert als zweites Argument von übergeben wird su.

Bonus: Als allgemeiner Hinweis sollten Sie nach Möglichkeit doppelte Klammern bei Tests vermeiden, da es sich um Bashismus handelt (Syntax, die nur mit Bash funktioniert und durch ein kompatibleres Gegenstück ersetzt werden könnte).

Die folgende Version sollte wie erwartet funktionieren.

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

verwandte Informationen