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
標準入力から読みます。実行中のシェルの標準入力はsu
hereドキュメントにリンクされているため、リテラル文字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