2013-05-06 5 views
8

Ich versuche, eine Benutzereingabe in einem Fisch Shell, insbesondere der folgenden oft gesehen Form zu sammeln:Wie bekomme ich eine Benutzerbestätigung in der Fischschale?

This command will delete some files. Proceed (y/N)? 

Nach einiger Suche um, ich bin immer noch nicht sicher, wie dies zu tun sauber.

Ist dies eine besondere Art, dies bei Fischen zu tun?

Antwort

14

Der beste Weg, den ich kenne, ist die eingebaute read. Der kann leider keine Schnur nehmen, sondern übernimmt stattdessen eine Funktion. Wenn Sie dies an mehreren Stellen verwenden können Sie diese Hilfsfunktion erstellen:

function read_confirm 
    while true 
    read -l -p read_confirm_prompt confirm 

    switch $confirm 
     case Y y 
     return 0 
     case '' N n 
     return 1 
    end 
    end 
end 

function read_confirm_prompt 
    echo 'Do you want to continue? [y/N] ' 
end 

und es verwenden, wie dies in Ihren Skripten/Funktionen:

if read_confirm 
    echo 'Do stuff' 
end 

Siehe Dokumentation für weitere Optionen: http://fishshell.com/docs/2.0/commands.html#read

+3

Eigentlich kann das Argument zu '-p' ein beliebiger Shell-Befehl sein, der wie in Leerzeichen erwartet, z. 'echo" Dateien löschen? [J/n]: "'' Aus dem verknüpften Dokument: "-p PROMPT_CMD oder --prompt = PROMPT_CMD verwendet die Ausgabe des Shell-Befehls PROMPT_CMD als Eingabeaufforderung für den interaktiven Modus. Die Standardeingabeaufforderung Befehl ist 'set_color grün; echo lesen; set_color normal; echo"> "' –

+0

Dies funktionierte für mich aber die Aufforderung impliziert, dass Ja ist Standard aber die Switch-Anweisung wird leer als Nr. – JonoCoetzee

+0

interpretieren Auch 'read_confirm; und echo 'Do stuff '' – Pysis

4

Dies tut das gleiche wie die gewählte Antwort, aber mit nur einer Funktion, scheint mir sauberer:

function read_confirm 
    while true 
    read -p 'echo "Confirm? (y/n):"' -l confirm 

    switch $confirm 
     case Y y 
     return 0 
     case '' N n 
     return 1 
    end 
    end 
end 

Die Prompt-Funktion kann als solche eingezeichnet werden.

2

Hier ist eine Version mit optionaler, notleidenden prompt:

function read_confirm --description 'Ask the user for confirmation' --argument prompt 
    if test -z "$prompt" 
     set prompt "Continue?" 
    end 

    while true 
     read -p 'set_color green; echo -n "$prompt [y/N]: "; set_color normal' -l confirm 

     switch $confirm 
      case Y y 
       return 0 
      case '' N n 
       return 1 
     end 
    end 
end 
1

Mit Hilfe einiger Fisch Plugins fisherman und get

beide zu installieren, einfach in Ihre Fische Schale

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher 
. ~/.config/fish/config.fish 
fisher get 

dann kannst du so etwas in deine Fischfunktion schreiben/script

get --prompt="Are you sure [yY]?:" --rule="[yY]" | read confirm 
switch $confirm 
    case Y y 
    # DELETE COMMAND GOES HERE 
end 
Verwandte Themen