現在、ttyに接続されているsuを介してheredocスクリプトを実行します。

現在、ttyに接続されているsuを介してheredocスクリプトを実行します。

私は次のことをしようとします:

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

問題は、selecthereドキュメントにリダイレクトされる標準入力から読み取ろうとすることです。プロンプトに対する応答がないため、エラーが発生します。

回避策は、ここで説明されているように入力を端末にリダイレクトすることです。

sudo -s <<'EOF'
select x in a b c; do 
    echo "Selected $x"
    break
done </dev/tty
EOF

EOFまた、here-docで変数が拡張されるのを防ぐには、周囲に引用符を入れる必要があります。それ以外の場合は、$x値を取得したサブシェルではなく元のシェルから拡張されますselect

おすすめ記事