编辑:
似乎在 内有效bash
。问题似乎与 有关zsh
。如果有更好的网站可以发布此问题,请告诉我。
我正在编写一个创建一系列目录的简单脚本。我希望用户在我执行此操作之前进行确认。我使用以下内容作为基础,但似乎无法让它在 bash 函数中运行。如果我将它放在函数之外,它可以正常工作。这是一个孤立的例子:
读取脚本
#!/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
- 我希望该函数位于配置文件中,这样我就可以从任何目录调用它(理想情况下是我的 .bashrc 或 .zshrc)
- 我已更正第一行注释的格式。问题仍然存在于
zsh
- Bash 版本是 3.2,但是您帮助我弄清楚问题出在 zsh 而不是 bash。
答案1
这–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?"
第一个参数中a 后面的任何内容?
都用作提示字符串。
当然,您可以指定要读入的变量名(这可能是更好的风格):
read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
...
fi
(引用 shell 变量通常也是一个好主意。)
答案2
该代码似乎可以在 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
三条评论:
答案3
此版本允许您拥有多个案例y
或Y
,n
或N
可选:重复该问题,直到提供批准问题
可选:忽略任何其他答案
可选:如果需要,退出终端
confirm() { echo -n "Continue? y or n? " read REPLY case $REPLY in [Yy]) echo 'yup y' ;; # you can change what you do here for instance [Nn]) echo 'nope n' ;; # Here are a few optional options to choose between # Any other answer: # 1. Repeat the question *) confirm ;; # 2. ignore # *) ;; # 3. Exit terminal # *) exit ;; esac # REPLY='' }
还要注意:在此函数的最后一行清除 REPLY 变量。否则,你echo $REPLY
会发现它仍然被设置,直到你打开或关闭终端或再次设置它。