私は次のことをしようとします:
sudo su <<EOF
select x in a b c; do echo "Selected $x"; break; done
EOF
ただし、入力を承認せずに終了します。
これはうまくいきます。
sudo su -c 'select x in a b c; do echo $x; break; done'
しかし、heredocに長いスクリプトを書く方が良いでしょう(例えば、ファイルに入れる方が良いことがわかります)。
この質問に対する答えはどこにでもあると確信していますが、bash/heredoc/tty/stdinの正しいクエリの組み合わせが見つからないようです。
これを達成する方法はありますか?
ベストアンサー1
問題は、select
hereドキュメントにリダイレクトされる標準入力から読み取ろうとすることです。プロンプトに対する応答がないため、エラーが発生します。
回避策は、ここで説明されているように入力を端末にリダイレクトすることです。
sudo -s <<'EOF'
select x in a b c; do
echo "Selected $x"
break
done </dev/tty
EOF
EOF
また、here-docで変数が拡張されるのを防ぐには、周囲に引用符を入れる必要があります。それ以外の場合は、$x
値を取得したサブシェルではなく元のシェルから拡張されますselect
。