sudoプロンプトを待つとエコー

sudoプロンプトを待つとエコー

コンテキスト

使っていますこの方法ルートとして実行しない場合は、スクリプトで権限を増やします。

私のBashスクリプトは、使用する必要がある特定のファイルが存在することを確認します。

if [ $EUID != 0 ]; then
    if [ -f "/foo/bar" ]
    then
        AGE=$(expr `date +%s` - `stat -c %Y "/foo/bar"`)
        echo "/foo/bar is here, ${AGE}s old"
    else
        echo "/foo/bar not there (yet?)"
    fi

    sudo "$0" "$@"
    exit $?
fi

# the rest of the script, needs /foo/bar

したがって、root以外のユーザーがこのコマンドを実行してファイルが存在する場合、応答は次のようになります/foo/bar is here, 27s old。それ以外の場合は応答です/foo/bar is not there (yet?)。次に、sudo実行するように求められます。

今質問は:2番目の場合、まだ準備ができていない場合は、表示されたらすぐにユーザーに通知する/foo/bar方法はありますか?/foo/barユーザーがパスワードを入力すると、「ああ、ファイルがあります」または、「待ってからもう一度Enterを押すことをお勧めします」というメッセージが表示されます。

ここには2つの部分があります。ファイルシステムにファイルがすでに存在するかどうかを検出する(これは聞かないでください)そしてsudoプロンプトが表示されたら、何かを鳴らします。

質問

私は2番目の部分に興味があります。 sudoプロンプトの上または下に「非同期的に」出力に何かを書き込むことはできますか?

ベストアンサー1

質問の2番目の部分であるプロンプトを待っている間にメッセージを作成する方法に答えるには、次のようにしますsudo

trap '2>/dev/null' CHLD
(sleep 5; echo; echo "New spam has just arrived!") &
MSGPID=$!
sudo -v
wait $MSGPID
trap - CHLD

sleep 5サブシェルに非同期的に到着するメッセージをシミュレートします。 1つ目は、echoメッセージがPassword:プロンプトの横に表示されないことを確認することです。stderr書き込みの代わりに書き込みを行うときにも機能しますstdout

1つ目trapは、バックグラウンドジョブのステータスに関するメッセージを削除することです。 waitpid2番目はtrap最初の効果をキャンセルしますtrap

意味のあるPIDを返す前にサブシェルのコマンドが終了すると、悪いことが発生する可能性があります(一部のオペレーティングシステムでは発生する可能性がありますが、今はそれほど多くないことを願っています)。

おすすめ記事