Bash - この文書は他のユーザーの入力値を読みます。

Bash - この文書は他のユーザーの入力値を読みます。

bashスクリプトにhereドキュメントがあります。次の値を読みたいです。

su myUser<<SESSION
set -x 
echo -n "Enter your name and press [ENTER]: "
read name
echo "the name is $name"
SESSION

ただし、他のユーザーからこのスクリプトを実行すると、bashは入力待機を停止せずにコマンドを無視しますread

どんなアイデアがありますか?

ベストアンサー1

L.スコットジョンソンが演じる正しく見つかりましたread標準入力から読みます。実行中のシェルの標準入力はsuhereドキュメントにリンクされているため、リテラル文字read列を読み込みます。echo "the name is "$name

ここにも同じことがありますが、ここのドキュメントを参照して$name追加の行を再出力します。

su username <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name
echo "the name is $name"
echo "What I read was $name"
SESSION

出力は次のとおりです

Password:
+ echo -n Enter your name and press [ENTER]:
Enter your name and press [ENTER]: + read name
+ echo What I read was echo "the name is $name"
What I read was echo "the name is $name"

これを正しく行うには、read標準入力から読み取ることができません。代わりに、標準入力のコピーで新しいファイル記述子を開いてread読んでください。

su username 3<&0 <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name <&3
echo "the name is $name"
SESSION

他のユーザーのシェルがbashまたはksh裏側read name <&3で置き換えることができますread -u3 name

ただし、子シェルは親シェルの環境(変数など)を変更できないため、シェル呼び出しnameで変数を設定することはできません。su

おすすめ記事