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
答え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"