Bearbeiten:
Scheint zu funktionieren bash
. Es scheint, dass das Problem damit zusammenhängt zsh
. Wenn es eine bessere Seite gibt, auf der Sie dieses Problem veröffentlichen können, lassen Sie es mich wissen.
Ich schreibe ein einfaches Skript, das eine Reihe von Verzeichnissen erstellt. Ich möchte, dass der Benutzer eine Bestätigung gibt, bevor ich dies tue. Ich verwende das Folgende als Basis, kann es jedoch nicht innerhalb einer Bash-Funktion ausführen. Wenn ich es außerhalb einer Funktion platziere, funktioniert es gut. Hier ist ein isoliertes Beispiel:
read.sh
#!/bin/bash
test() {
read -p "Here be dragons. Continue?" -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "You asked for it..."
fi
}
Code aus diesem SO Post.
Sourcing die Datei und / oder test
Ergebnisse in dem folgenden Fehler: read:1: -p: no coprocess
. Gleiche Ausgabe, wenn ich es in meine.bashrc
Bearbeiten :
@hennes
- Ich möchte, dass sich die Funktion in einer Konfigurationsdatei befindet, damit ich sie aus einem beliebigen Verzeichnis aufrufen kann (idealerweise aus meiner .bashrc- oder .zshrc-Datei).
- Ich habe die Formatierung der ersten kommentierten Zeile korrigiert. Problem besteht immer noch in
zsh
- Die Bash-Version ist 3.2, aber Sie haben mir geholfen herauszufinden, dass das Problem mit zsh und nicht mit bash zusammenhängt.
quelle
#! /bin/bash
mit einem Leerzeichen hinter ihr? Ich dachte das wären nicht erlaubt? 3) '#! / Usr / bin / env bash' ist wahrscheinlich besser. 4) Welche Bash-Version? (Ich testete mit Bash 4.1.10 auf FreeBSD und bekam keine Fehler)zsh
nicht gedacht, dass es einen Konflikt mit Bash-Skripten geben würde (ich habe mehrere ähnliche Skripten, die in Ordnung sind). Ich habe es erneut markiert und auf Ihre Fragen geantwortet. Danke, dass du mich in die richtige Richtung gelenkt hast!./read.sh
. Es wird nicht benötigt, Sie führen es auf andere Weise aus oder wenn Sie es in ein Startskript einfügen. Und wenn Sie es in zsh mit `zsh ./read.sh 'ausführen möchten, werden die mit einem # beginnenden Zeilen ignoriert. Sie sind auch verwirrend, da sie den Eindruck erwecken, dass Sie bash verwenden, wenn Sie zsh verwenden.Antworten:
Die
–p
Option bedeutet nicht das Gleiche zubash
‚sread
integriertes Kommando undzsh
‘ sread
integrierten Befehl. Inzsh
'sread
Kommando–p
bedeutet - rate - "Eingabe wird aus dem Coprozess gelesen." Ich schlage vor, dass Sie Ihre Eingabeaufforderung mitecho
oder anzeigenprintf
.Sie können auch ersetzen müssen
–n 1
mit–k
oder–k 1
.Das
zsh
Äquivalent vonbash
‚sread -p prompt
ISAlles nach einem
?
im ersten Argument wird als Eingabeaufforderungszeichenfolge verwendet.Und natürlich können Sie einen Variablennamen angeben, in den eingelesen werden soll (und dies könnte einen besseren Stil haben):
(Das Zitieren von Shell-Variablen ist im Allgemeinen auch eine gute Idee.)
quelle
Dieser Code scheint in zsh zu tun, was Sie wollen.
(Beachten Sie, dass in der Frage, auf die Sie sich bezogen haben, ausdrücklich erwähnt wird, dass es sich um eine Bash handelt.)
Drei Kommentare:
quelle
REPLY=""
, um die Variable REPLY zu löschen. Wenn Sie andernfalls $ REPLY wiederholen, wird angezeigt, dass es noch gesetzt ist, bis Sie Ihr Terminal öffnen oder schließen oder es erneut setzen.Mit dieser Version können Sie mehr als einen Fall haben ,
y
oderY
,n
oderN
Optional: Wiederholen Sie die Frage, bis eine Genehmigungsfrage bereitgestellt wird
Optional: Ignorieren Sie jede andere Antwort
Optional: Verlassen Sie das Terminal, wenn Sie möchten
Beachten Sie auch dies: Löschen Sie in der letzten Zeile dieser Funktion die Variable REPLY. Andernfalls
echo $REPLY
bleibt die Einstellung bestehen, bis Sie das Terminal öffnen, schließen oder erneut einstellen.quelle