In diesem speziellen Fall möchte ich eine Bestätigung in Bash für hinzufügen
Bist du sicher? [J / n]
für Mercurial's hg push ssh://[email protected]//somepath/morepath
, was eigentlich ein Alias ist. Gibt es einen Standardbefehl, der dem Alias hinzugefügt werden kann, um dies zu erreichen?
Der Grund ist, dass hg push
und hg out
kann ähnlich klingen und manchmal, wenn ich will hgoutrepo
, kann ich versehentlich tippen hgpushrepo
(beide sind Aliase).
Update: Wenn es so etwas wie ein eingebauter Befehl mit einem anderen Befehl sein kann, wie zum Beispiel: confirm && hg push ssh://...
Das wäre großartig ... nur ein Befehl, der nach einem yes
oder fragen no
und mit dem Rest fortfahren kann, wenn yes
.
bash
alias
confirmation
Unpolarität
quelle
quelle
info bash
: "Für fast jeden Zweck werden Shell-Funktionen Aliasen vorgezogen."ls -l
oderrm -i
?alias rm='rm -i'
. Eines Tages, wenn Sie es am meisten brauchen, wird der Alias nicht da sein undboom!
etwas Wichtiges geht verloren.rm -i
, können Sie auch nicht mit einem Shell-Skript rechnen. Also tippst du immerrm -i
jedes Mal?rm
und das-i
Verhalten eingeben und erwarten . Dann ist der Alias eines Tages nicht mehr vorhanden (aus irgendeinem Grund wird er nicht gesetzt oder nicht gesetzt oder Sie befinden sich auf einem anderen System ) und Sie tippenrm
und es geht sofort los, Dinge ohne Bestätigung zu löschen. Hoppla! Wenn Sie jedoch einen Alias wie diesen erstelltalias askrm='rm -i'
haben, ist dies in Ordnung, da der Fehler "Befehl nicht gefunden" angezeigt wird.Antworten:
Dies sind kompaktere und vielseitigere Formen der Antwort von Hamish . Sie verarbeiten jede Mischung aus Groß- und Kleinbuchstaben:
Oder für Bash> = Version 3.2:
Hinweis: Wenn
$response
es sich um eine leere Zeichenfolge handelt, wird ein Fehler ausgegeben. Fügen Sie zum Beheben einfach Anführungszeichen hinzu :"$response"
. - Verwenden Sie immer doppelte Anführungszeichen in Variablen enthalten Zeichenketten (zB: lieber verwenden"$@"
statt$@
).Oder Bash 4.x:
Bearbeiten:
Als Antwort auf Ihre Bearbeitung würden Sie wie folgt einen
confirm
Befehl erstellen und verwenden, der auf der ersten Version in meiner Antwort basiert (dies würde ähnlich mit den beiden anderen funktionieren):So verwenden Sie diese Funktion:
oder
quelle
not equal to
die$response
Variable umwandeln sollten , wenn Sie das zweite Beispiel überprüfen möchten . ZB :if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
.=~
es sich um den Regex-Übereinstimmungsoperator handelt.Hier ist ungefähr ein Ausschnitt, den Sie wollen. Lassen Sie mich herausfinden, wie die Argumente weitergeleitet werden.
Achtung
yes | command name here
:)quelle
Bestätigungen können mit Wagenrückläufen leicht umgangen werden, und ich finde es nützlich, ständig nach gültigen Eingaben zu fragen.
Hier ist eine Funktion, um dies zu vereinfachen. "Ungültige Eingabe" wird rot angezeigt, wenn Y | N nicht empfangen wird, und der Benutzer wird erneut aufgefordert.
Sie können die Standardaufforderung ändern, indem Sie ein Argument übergeben
quelle
Um zu vermeiden, dass explizit nach diesen Varianten von 'yes' gesucht wird, können Sie den Bash-Operator für reguläre Ausdrücke '= ~' mit einem regulären Ausdruck verwenden:
Dadurch wird geprüft, ob die Benutzereingabe mit 'y' oder 'Y' beginnt und auf null oder mehr 'es' folgt.
quelle
Dies kann ein Hack sein:
Wie in Frage : Ist "xargs -p" in Unix / Bash eine gute Möglichkeit, vor dem Ausführen eines Befehls zur Bestätigung aufzufordern?
wir können verwenden
xargs
, um die Arbeit zu erledigen:Natürlich wird dies als Alias gesetzt, wie
hgpushrepo
Beispiel:
quelle
Fügen Sie Ihrer Datei / etc / bashrc Folgendes hinzu. Dieses Skript fügt eine residente "Funktion" anstelle eines Alias namens "Bestätigen" hinzu.
quelle
$response
und$@
um Fehlanalysen zu vermeiden, gibt es einige redundante Semikolons, und die*
Bedingung sollte zurückkehren und nicht beenden .Das mag etwas zu kurz sein, aber für meinen privaten Gebrauch funktioniert es großartig
Der
read -n 1
liest nur ein Zeichen. Sie müssen nicht die Eingabetaste drücken. Wenn es kein 'n' oder 'N' ist, wird angenommen, dass es ein 'Y' ist. Nur die Eingabetaste zu drücken bedeutet auch Y.(Was die eigentliche Frage betrifft: Machen Sie das zu einem Bash-Skript und ändern Sie Ihren Alias so, dass er auf dieses Skript verweist, anstatt auf das, worauf zuvor verwiesen wurde.)
quelle
quelle
Keine Eingabetaste erforderlich
Hier ist ein längerer, aber wiederverwendbarer und modularer Ansatz:
0
= ja und1
= neinzsh
undbash
.Standardmäßig "Nein", wenn Sie die Eingabetaste drücken
Beachten Sie, dass das
N
groß geschrieben ist. Hier wird die Eingabetaste gedrückt, wobei die Standardeinstellung übernommen wird:Beachten Sie auch, dass dies
[y/N]?
automatisch angehängt wurde. Das Standard "Nein" wird akzeptiert, daher wird nichts wiedergegeben.Erneut auffordern, bis eine gültige Antwort gegeben wird:
Standardmäßig "Ja", wenn Sie die Eingabetaste drücken
Beachten Sie, dass das
Y
groß geschrieben wird:Oben habe ich nur die Eingabetaste gedrückt, sodass der Befehl ausgeführt wurde.
Kein Standard ein enter- erfordern
y
odern
Hier
1
oder falsch wurde zurückgegeben. Beachten Sie keine Großschreibung in[y/n]?
Code
quelle
Nun, hier ist meine Version von
confirm
, modifiziert von James ':Diese Änderungen sind:
local
diese Option, um zu verhindern, dass Variablennamen kollidierenread
verwenden$2 $3 ...
ihre Wirkung zu steuern, so können Sie verwenden ,-n
und-t
read
erfolglos beendet wird, wirdecho
ein Zeilenvorschub für Schönheit erstelltGit on Windows
einziges hatbash-3.1
und hat keintrue
oderfalse
, also benutzereturn
stattdessen. Dies ist natürlich auch mit bash-4.4 (dem aktuellen in Git für Windows) kompatibel.quelle
Mit dieser Version können Sie mehr als einen Fall haben ,
y
oderY
,n
oderN
Optional: Wiederholen Sie die Frage, bis eine genehmigende Frage bereitgestellt wird
Optional: Ignorieren Sie jede andere Antwort
Optional: Verlassen Sie das Terminal, wenn Sie möchten
Beachten Sie auch Folgendes: Löschen Sie in der letzten Zeile dieser Funktion die Variable REPLY. Andernfalls wird es, wenn Sie
echo $REPLY
sehen, immer noch eingestellt, bis Sie Ihr Terminal öffnen oder schließen oder erneut einstellen.quelle
Spät zum Spiel, aber ich habe noch eine andere Variante der
confirm
Funktionen früherer Antworten erstellt:Um es zu benutzen:
Eigenschaften:
Bugs:
echo -en
funktioniert mit, kannbash
aber in Ihrer Shell fehlschlagenecho
oder störenxargs
quelle
Versuchen,
quelle
Dies ist nicht gerade ein "Nach Ja oder Nein fragen", sondern nur ein Hack: Alias das
hg push ...
Nicht-zu-hgpushrepo
aber zuhgpushrepoconfirmedpush
und bis ich das Ganze buchstabieren kann, hat die linke Gehirnhälfte eine logische Entscheidung getroffen.quelle
TAB
Schlüssel verwenden werden!Nicht das gleiche, aber eine Idee, die trotzdem funktioniert.
Ausgabe:
Wieder? J / n N
Schon wieder? J / n
Wieder etwas? J / n 7
Schon wieder? J / n & schon
wieder? J / n nsijf
$
Überprüft jetzt nur das erste Zeichen von $ i read.
quelle
Der folgende Code kombiniert zwei Dinge
shopt -s nocasematch, das sich um Groß- und Kleinschreibung kümmert
und wenn eine Bedingung vorliegt, die beide Eingaben akzeptiert, übergeben Sie entweder yes, Yes, YES, y.
shopt -s nocasematch
if [[sed-4.2.2. $ LINE = ~ (yes | y) $]]
dann beenden Sie 0
fi
quelle
Hier ist meine Lösung, die lokalisierte Regex verwendet. Auf Deutsch würde also auch "j" für "Ja" als ja interpretiert werden.
Das erste Argument ist die Frage, wenn das zweite Argument "y" ist, wäre "Ja" die Standardantwort, andernfalls "Nein" die Standardantwort. Der Rückgabewert ist 0, wenn die Antwort "Ja" war, und 1, wenn die Antwort "Nein" war.
Hier ist eine grundlegende Verwendung
quelle