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


29

编辑:

似乎在工作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
}

SO帖子中的代码。

搜索文件和/或test导致以下错误:read:1: -p: no coprocess。当我将其放在我的输出相同.bashrc

编辑

@hennes

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

1)在实际调用函数test()的任何地方?2)#! /bin/bash在她的背后有一个空格?我以为那些不被允许?3)'#!/ usr / bin / env bash'可能更好。4)哪个bash版本?(我在FreeBSD上使用bash 4.1.10进行了测试,没有出现错误)
Hennes

我使用了不正确的问题标记,zsh但我不认为与bash脚本会有冲突(我还有其他几个运行良好的类似脚本)。我已重新标记它,并回答了您的问题。感谢您指出正确的方向!
尼克·汤姆林

您如何启动程序?仅当您想使用执行文件时,才需要使用shebang(#!)解释器`行./read.sh。如果您以任何其他方式运行它,或者将其放在启动脚本中,则不需要它。如果要在zsh中使用`zsh ./read.sh'运行它,则以#开头的行将被忽略。他们也感到困惑,因为他们给人的印象是,当您使用zsh时,您会使用bash。
Hennes

@NickTomlin您是否知道如何使其工作而不必在Enter(在ZSH下)后面加上“ y”?
syntagma

@REACHUS las,我没有。祝好运!
尼克·汤姆林

Answers:


49

–p选项与bashread内置命令和zshread内置命令并不相同。在zshread命令中,–p意味着-猜测-“从协同处理中读取输入。”我建议您使用echo或来显示提示printf

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


zsh同等bashread -p prompt就是

read "?Here be dragons. Continue?"

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

当然,您可以指定要读入的变量名称(这可能是更好的样式):

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

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


感谢您解释为什么此功能无法正常运行。以后我会检查这种差异。
尼克·汤姆林

很好的解释,谢谢!
遇到

8

这段代码似乎可以在zsh中完成您想要的工作。
(请注意,您提到的问题明确提到了bash的问题)。

#!/ usr / bin / env zsh

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

  如果[[$ REPLY =〜^ [Yy] $]]
  然后
    回声“您要的是...”
  科幻
}

测试

三点评论:


谢谢您的帮助。我之所以给出@scott的答案,是因为解释了为什么它不起作用,但是您给我的代码片段效果很好。
Nick Tomlin

1
仅剩三件事:最好是在SO上问(因为这是编程问题)。2)并非所有shell都兼容(man zsh返回不同的内容用于读取-p,然后man bash进行。3)另一个解决方案是searchj搜索vared -c -p'提示问题'
Hennes

+1感谢您告诉我。我将把将来以编程为中心的问题直接交给SO。
尼克·汤姆林

在此函数的最后一行,您应该添加REPLY=""清除REPLY变量。否则,如果您回显$ REPLY,您将看到它仍处于设置状态,直到您打开或关闭终端或再次设置它为止。
jasonleonhard

0

此版本允许您使用多个案例yYnN

  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=''
    }

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.