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ですが、問題はbashではなくzshにあることがわかりました。

1)実際に関数test()を呼び出す場所はありますか?2)#! /bin/bash彼女の後ろにスペースがありますか?それらは許可されていないと思いましたか?3)「#!/ usr / bin / env bash」の方がおそらく良いでしょう。4)どのbashバージョンですか?(私はFreeBSD上ではbash 4.1.10でテストし、エラーを持っていない)
ヘネス

私は質問を不適切にタグ付けしました、私は使用zshしていますが、bashスクリプトと競合するとは思いませんでした(他のいくつかの同様のスクリプトが正常に実行されています)。私はそれをタグ付けし直して、あなたの質問に答えました。私を正しい方向に向けてくれてありがとう!
ニックトムリン

プログラムをどのように開始しますか?shebang(#!)interpreter行は、でファイルを実行する場合にのみ必要です./read.sh。他の方法で実行したり、起動スクリプトに入れたりする必要はありません。また、zshで `zsh ./read.sh 'を使用して実行する場合、#で始まる行は無視されます。また、zshを使用するときにbashを使用するという印象を与えるため、混乱します。
ヘネス

@NickTomlin 'y'(ZSHの下)の後にEnterを入力せずに機能させる方法を知っていますか?
シンタグマ

@REACHUS悲しいかな、私はしません。幸運を!
ニックトムリン

回答:


49

この–pオプションは、bashread組み込みコマンドとzshread組み込みコマンドで同じことを意味するものではありません。コマンド、手段-の推測は- 『入力はコプロセスから読み込まれます。』私はあなたとあなたのプロンプトを表示することを示唆していますか。zshread–pechoprintf

また、交換する必要があるかもしれません–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

(シェル変数を引用することも一般的には良い考えです。)


これが正しく機能しない理由を説明してくれてありがとう。今後、このような違いを確認します。
ニックトムリン

素晴らしい説明、ありがとう!まったく同じ問題があった
iosifv

8

このコードは、zshで必要なことを行うようです。
(あなたが参照した質問は、bashに関するものだと明示的に言及していることに注意してください)。

#!/ usr / bin / env zsh

テスト()
{
  echo -n「ここにドラゴンがいます。続行しますか?」
  返信を読む

  if [[$ REPLY =〜^ [Yy] $]]
  それから
    echo「あなたはそれを求めました...」
  fi
}

テスト

3つのコメント:


ご協力ありがとうございました。@scottへの回答は、これが機能しない理由の説明のために与えましたが、あなたが私に与えたスニペットは完全に機能します。
ニックトムリン

1
あと3つだけです。これはおそらくSOで最もよく尋ねられたものです(プログラミングの質問なので)。2)すべてのシェルが、その後-p読ん男のbashのためのさまざまなものがありません互換性(男性zshの戻りわけではありません3)別の解決策は、vared -c -p「プロンプト質問」のsearchjになります
ヘネス

+1お知らせいただきありがとうございます。将来のプログラミング中心の質問をSOに向けます。
ニックトムリン

この関数の最後の行でREPLY=""、REPLY変数をクリアするために追加する必要があります。それ以外の場合、$ REPLYをエコーすると、ターミナルを開くか閉じるか、再度設定するまで設定されたままになります。
ジェイソンレオンハルト

0

このバージョンでは、複数のケースyまたはを持つことができますYnまたはN

  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は、端末を開いたり閉じたりするか、再度設定するまで、設定されたままになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.