ZSH:读取命令在 bash 函数“read:1: -p: no coprocess”中失败

Nic*_*lin 47 zsh bash-scripting

编辑:

似乎在bash. 看来问题与zsh. 如果有更好的网站可以发布此问题,请告诉我。


我正在编写一个创建一系列目录的简单脚本。我希望用户在我这样做之前给予确认。我使用以下作为基础,但似乎无法让它在 bash 函数中运行。如果我把它放在函数之外,它工作正常。这是一个孤立的例子:

读.sh

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

来自this SO post的代码。

获取文件和/或test导致以下错误:read:1: -p: no coprocess. 当我把它放在我的.bashrc

编辑::

@hennes

  1. 我希望该函数位于配置文件中,因此我可以从任何目录(最好是我的 .bashrc 或 .zshrc)调用它
  2. 我已经更正了第一行注释行的格式。问题仍然存在于zsh
  3. Bash 版本是 3.2,但您帮助我弄清楚问题出在 zsh 而不是 bash。

Sco*_*ott 81

–p选项与bash's readbuilt-in command 和zsh's readbuilt-in 命令的含义不同。inzshread命令,–p意思是——猜测——“输入是从协进程中读取的。” 我建议您使用echo或显示提示printf

您可能还需要替换–n 1–k–k 1


zsh同等bashread -p prompt就是

read "?Here be dragons. Continue?"
Run Code Online (Sandbox Code Playgroud)

?第一个参数中a 之后的任何内容都用作提示字符串。

当然,你可以指定一个变量名来读入(这可能是更好的风格):

read "brave?Here be dragons. Continue?"
if [[ "$brave" =~ ^[Yy]$ ]]
then
    ...
fi
Run Code Online (Sandbox Code Playgroud)

(引用 shell 变量通常也是一个好主意。)

  • 令人沮丧的是,当您检查“man read”时,“zsh”中没有给出此信息...非常感谢 (4认同)

Hen*_*nes 9

这段代码似乎可以在 zsh 中执行您想要的操作。
(请注意,您提到的问题明确提到它是针对 bash 的)。

#!/usr/bin/env zsh

测试()
{
  echo -n “这里有龙。继续?”
  阅读回复

  如果 [[ $REPLY =~ ^[Yy]$ ]]
  然后
    echo "你要的……"
  菲
}

测试

三个评论:


jas*_*ard 5

此版本允许您拥有多个案例yY,nN

  1. 可选:重复问题,直到提供批准问题

  2. 可选:忽略任何其他答案

  3. 可选:如果需要,退出终端

    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=''
    }
    
    Run Code Online (Sandbox Code Playgroud)

还要注意这一点:在此函数的最后一行清除 REPLY 变量。否则,如果您echo $REPLY会看到它仍然处于设置状态,直到您打开或关闭终端或再次设置它。