Редактировать:
Кажется, работает внутри 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
}
код из этого поста.
Sourcing файла и / или test
результатов в следующей ошибке: read:1: -p: no coprocess
. Тот же вывод, когда я помещаю его в мой.bashrc
Редактировать ::
@hennes
- Я хочу, чтобы функция была в конфигурационном файле, поэтому я могу вызывать ее из любого каталога (в идеале мой .bashrc или .zshrc)
- Я исправил форматирование первой закомментированной строки. Проблема все еще существует в
zsh
- Версия Bash 3.2, но вы помогли мне понять, что проблема в zsh, а не в bash.
zsh
bash-scripting
Ник Томлин
источник
источник
#! /bin/bash
с пробелом сзади она шебанг? Я думал, что это не разрешено? 3) «#! / Usr / bin / env bash», вероятно, лучше. 4) Какая версия Bash? (Я тестировал bash 4.1.10 на FreeBSD и не получил ошибок)zsh
но не думал, что возникнет конфликт со скриптами bash (у меня есть несколько других похожих скриптов, работающих нормально). Я пометил его и ответил на ваши вопросы. Спасибо, что указал мне правильное направление!./read.sh
. В этом нет необходимости, вы запускаете его любым другим способом или помещаете в сценарий запуска. И если вы хотите запустить его в zsh с помощью `zsh ./read.sh ', тогда строки, начинающиеся с #, игнорируются. Они также сбивают с толку, так как создают впечатление, что вы используете bash, когда используете zsh).Ответы:
–p
Вариант не означает , что то же самое сbash
«Sread
встроенная команда иzsh
» sread
встроенную команду. Вzsh
«Sread
команды,–p
значит - догадка -„Input считывается из coprocess.“Я полагаю , что вы показываете ваше приглашение сecho
илиprintf
.Вам также может понадобиться заменить
–n 1
на–k
или–k 1
.zsh
Эквивалентbash
«ыread -p prompt
естьВсе, что находится после
?
первого аргумента, используется в качестве строки приглашения.И, конечно, вы можете указать имя переменной для чтения (и это может быть лучше стиль):
(Кавычки переменных оболочки, как правило, тоже хорошая идея.)
источник
Этот код, кажется, делает то, что вы хотите в Zsh.
(Обратите внимание, что в вопросе, на который вы ссылались, он явно упоминается как bash).
Три комментария:
источник
REPLY=""
очистить переменную REPLY. В противном случае, если вы откроете $ REPLY, вы увидите, что он все еще установлен, пока вы не откроете или не закроете свой терминал или не установите его снова.Эта версия позволяет вам иметь более одного случая
y
илиY
,n
илиN
Дополнительно: повторяйте вопрос до тех пор, пока не будет предоставлен вопрос для утверждения.
Опционально: игнорировать любой другой ответ
Опционально: выйдите из терминала, если хотите
Обратите внимание и на это: в последней строке этой функции очистите переменную REPLY. В противном случае, если вы
echo $REPLY
увидите, что он все еще установлен, пока вы не откроете или не закроете свой терминал или не установите его снова.источник