Как получить подтверждение пользователя в раковине?

Я пытаюсь собрать пользовательский ввод в текстовом файле fish, особенно в следующем виде:

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

После некоторого поиска, я все еще не уверен, как сделать это чисто.

Это особый способ сделать это в рыбе?

Ответ 1

Лучший способ, которым я знаю, - использовать встроенный read. Если вы используете это в нескольких местах, вы можете создать эту вспомогательную функцию:

function read_confirm
  while true
    read -l -P 'Do you want to continue? [y/N] ' confirm

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

и используйте его в своих сценариях/функциях:

if read_confirm
  echo 'Do stuff'
end

См. документацию по дополнительным параметрам: https://fishshell.com/docs/current/commands.html#read

Ответ 2

Это делает то же, что и выбранный ответ, но только с одной функцией, кажется мне более чистым:

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

Функция подсказки может быть встроена как таковая.

Ответ 3

Здесь версия с необязательным приглашением по умолчанию:

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

Ответ 4

С помощью некоторых плагинов для рыбы fisherman и get

Чтобы установить оба, просто в вашей рыбной оболочке

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

тогда вы можете написать что-то подобное в своей рыбной функции /script

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