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
- 関数を設定ファイルに入れたいので、どのようなディレクトリ(理想的には .bashrc や .zshrc)からでも呼び出すことができます
- 最初にコメントした行の書式を修正しました。
zsh
に問題が残っています - Bashのバージョンは3.2ですが、あなたのおかげで問題はbashではなくzshにあることがわかりました
36 Nick Tomlin 2013-02-22
–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?"
第一引数の?
以降はプロンプト文字列として使用されます
そして、もちろん変数名を指定して読み込ませることもできます(こちらの方がスタイルが良いかもしれません)
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
または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
の場合、ターミナルを開いたり閉じたりするか、再度設定するまで、変数が設定されたままになっていることがわかります
1 jasonleonhard 2019-09-26