Nehmen wir an, ich habe eine Datei confirmation.sh
mit dem folgenden Inhalt:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
und ich möchte dieses Skript folgendermaßen ausführen:
cat confirmation.sh | sh
Ich sehe Are you sure [Y/n]?
und das Skript wird unterbrochen. Was ist das Problem?
shell-script
shell
pipe
user-input
Igor Timoshenko
quelle
quelle
/bin/bash
in der Bang-Zeile, aber Sie verwenden eine.sh
Erweiterung und versuchen, das Skript zu leitensh
. Kein Problem, da der Code, den Sie haben, mit beiden kompatibel ist, aber es lohnt sich darauf hinzuweisen.Antworten:
Wie andere gesagt haben, liegt dies daran, dass das
stdin
vonsh
zum Lesen aus der Pipe umgeleitet wurde und nicht wie gewohnt mit dem Terminal verbunden ist. Eine Möglichkeit/dev/tty
, dies zu umgehen , besteht darin, das Lesen des Skripts vom Terminal zu erzwingen. Z.B:Normalerweise würden Sie dies nur tun, wenn Sie speziell verhindern möchten, dass Personen die Eingabe als Skript ausführen, z.
Dies würde immer noch vom Terminal gelesen, obwohl der Benutzer möglicherweise erwartet, dass dies automatisch
Y
an der Eingabeaufforderung eingegeben wird . Es ist üblich, dass Programme, die ein Kennwort erwarten, dies tun.quelle
Hinweis: Vielen Dank an @Graeme für die Korrektur der beiden oben genannten Beispiele ...
Es ist viel einfacher, wenn Sie sich
stdin
klar halten .Oder, da die 0 1 2 eines Terminals alle dieselbe Datei sind, fügen Sie einfach Folgendes hinzu:
Und dein
Funktioniert gut.
quelle
stderr
beschaffe. Ich sollte es wahrscheinlich tun, ich verstehe nicht warum.Dies hat für ein einzelnes Argument funktioniert, das an mein Skript weitergeleitet wurde:
Ich kann dann in einem Positionsargument (
$1
) auf die weitergeleiteten Daten zugreifen , das mit meinen anderen Skriptfunktionen kompatibel ist.Von
info test
:quelle
Die kurze Antwort lautet: Sie können nicht. Die Pipe leitet stdout nach stdin um, sodass Sie kein interaktives Skript ausführen können, da Sie die Ausgabe des ersten Befehls bereits als Eingabe zum zweiten Befehl in der Pipe-Anweisung umgeleitet haben.
Vielleicht möchten Sie so etwas tun:
quelle
sh confirmation.sh
?