18

Редактировать:

Кажется, работает в bash . Похоже, проблема связана с zsh . Если есть лучший сайт для публикации этого вопроса, дайте мне знать.


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

read.sh

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

код из этого поста.

Поиск файла и / или результатов test при следующей ошибке: read:1: -p: no coprocess . Тот же вывод, когда я помещаю его в мой .bashrc

Редактировать::

@hennes

  1. Я хочу, чтобы функция была в конфигурационном файле, поэтому я могу вызывать ее из любого каталога (в идеале мой .bashrc или .zshrc)
  2. Я исправил форматирование первой закомментированной строки. Проблема все еще существует в zsh
  3. Версия Bash 3.2, но вы помогли мне понять, что проблема в zsh, а не в bash.

2 ответа2

33

Параметр –p не означает одно и то же для встроенной команды bash read и встроенной команды zsh read .  В команде zsh read –p означает –– предположить –– «Входные данные считываются из сопроцесса».  Я предлагаю вам показать ваш запрос с помощью echo или printf .

Вам также может понадобиться заменить –n 1 на –k или –k 1.


zsh эквивалент приглашения bash read -p prompt

read "?Here be dragons. Continue?"

Что-нибудь после ? в качестве первого аргумента используется строка приглашения.

И, конечно, вы можете указать имя переменной для чтения (и это может быть лучше стиль):

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi

(Кавычки переменных оболочки, как правило, тоже хорошая идея.)

8

Этот код, кажется, делает то, что вы хотите в Zsh.
(Обратите внимание, что вопрос, на который вы ссылались, явно упоминает, что он относится к bash).

#!/usr/bin/env zsh

test()
{
  echo -n "Here be dragons. Continue?"
  read REPLY

  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}

test

Три комментария:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .