コンテキスト
使っていますこの方法ルートとして実行しない場合は、スクリプトで権限を増やします。
私の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
は、バックグラウンドジョブのステータスに関するメッセージを削除することです。 waitpid
2番目はtrap
最初の効果をキャンセルしますtrap
。
意味のあるPIDを返す前にサブシェルのコマンドが終了すると、悪いことが発生する可能性があります(一部のオペレーティングシステムでは発生する可能性がありますが、今はそれほど多くないことを願っています)。