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

答え2

読み取りコマンドを無視せずに実行し、標準入力を読み取ります。次に、その行をecho "the name is $name標準入力から読み取り、$ nameに割り当てます。

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

出力:

+ echo -n '"Enter' your name and press '[ENTER]:' '"'
-n "Enter your name and press [ENTER]: "
+ read name
+ echo '"the' name is 'someUser"' 
"the name is someUser"

関連情報