ZSH: “read:1: -p: no coprocess” という bash 関数内で読み込みコマンドが失敗しました

bash-scripting zsh

Edit:

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に配置しても同じ出力

Edit::

@hennes

  1. 関数を設定ファイルに入れたいので、どのようなディレクトリ(理想的には .bashrc や .zshrc)からでも呼び出すことができます
  2. 最初にコメントした行の書式を修正しました。zshに問題が残っています
  3. Bashのバージョンは3.2ですが、あなたのおかげで問題はbashではなくzshにあることがわかりました

  36  Nick Tomlin  2013-02-22


ベストアンサー

–pオプションは、bashread組み込みコマンドとzshread組み込みコマンドでは同じ意味ではありません。zshread コマンドでは、–p は — 推測 — “入力をコプロセッサから読み取る” という意味になります。プロンプトをechoprintfで表示することをお勧めします

また、–n 1–k–k 1に置き換える必要があるかもしれません


zshbashread -p promptに相当するのは

read "?Here be dragons. Continue?"

第一引数の?以降はプロンプト文字列として使用されます

そして、もちろん変数名を指定して読み込ませることもできます(こちらの方がスタイルが良いかもしれません)

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

(シェル変数を引用するのも一般的には良いアイデアです)

66  Scott  2013-02-22


このコードは、あなたが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

Three comments:

8  Hennes  2013-02-22


このバージョンでは、複数のケース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の場合、ターミナルを開いたり閉じたりするか、再度設定するまで、変数が設定されたままになっていることがわかります

1  jasonleonhard  2019-09-26


タイトルとURLをコピーしました