たとえば、15秒以上実行されたコマンドが対話型シェルで終了するたびにデスクトップ通知を受け取りたいです。
言い換えれば、私はすべてのコマンドがこのようなものに包まれることを望みます
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
これをbashで達成する最良の方法は何ですか?
https://launchpad.net/undistract-me (UbuntuアーカイブからSudo apt-get install undistract-me
でインストール可能)、自動での作業(つまり、長時間実行される可能性のあるコマンドに何かを追加することを忘れずに)。
私の知る限り、 wrapper が必要です。また、コマンドの実行時間が15秒を超えている場合にコマンドを使用して、必要な通知を行うようにします。ここにあります。
wrapper(){
start=$(date +%s)
"$@"
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}
~/.bashrc
およびソース~/.bashrc
にこの関数をコピーして、
. ~/.bashrc
使用法
wrapper <your_command>
15秒以上かかる場合は、コマンドとその実行時間を説明するデスクトップ通知が表示されます。
例
wrapper Sudo apt-get update
~/.bashrc
には、次のように定義されるエイリアスalert
があります。
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
コマンド実行の完了を通知するために使用できます。
使用法:
$ the_command; alert
例えば.
$ Sudo apt-get update; alert
エイリアスは、必要に応じてカスタマイズできます。
Souravcのようなラッパーは別として、これをbashで実行する良い方法はありません。 DEBUGトラップとPrompt_COMMANDを使用して、ハックすることができます。 DEBUGトラップは、コマンドを実行するたびにトリガーされ、プロンプトが書き込まれる直前にPrompt_COMMANDが実行されます。
~/.bashrc
のようなものは次のようになります
trap '_start=$SECONDS' DEBUG
Prompt_COMMAND='(if (( SECONDS - _start > 15 )); then notify-send "Long running command ended"; fi)'
これはハックですので、奇妙な副作用に遭遇しても驚かないでください。
編集
TL; DR:.inputrc
にオートコンプリートショートカットを作成し、.bashrc
に関数を作成します。通常どおりコマンドを実行し、入力しますが、代わりに ENTER、.inputrc
で指定したショートカットを押します
この質問に賞金をかけた人は言った:
「既存の回答はすべて、コマンドの後に追加のコマンドを入力する必要があります。これを自動的に行う回答が必要です。」
この問題の解決策を研究している間、私はつまずきました this stackexchangeからの質問。 CtrlJ コマンドのシーケンスへ: Ctrla (行の先頭に移動)、入力したコマンドの前に「mesure」文字列を配置し、 Ctrlm (実行)
したがって、オートコンプリートの機能と個別の ENTER second関数の本来の目的を維持しながら、時間を測定するコマンドは、以下に掲載されています。
今のところ、私の~/.inputrc
ファイルの内容は次のとおりです。
"\C-j": "\C-a measure \C-m"
そして、ここに.bashrc
の内容があります(注、私は永遠にbashを使用していません-mkshをシェルとして使用しているため、元の投稿で見たとおりです。機能は同じです)
PS1=' serg@ubuntu [$(pwd)]
================================
$ '
function measure ()
{
/usr/bin/time --output="/home/xieerqi/.timefile" -f "%e" $@
if [ $( cat ~/.timefile| cut -d'.' -f1 ) -gt 15 ]; then
notify-send "Hi , $@ is done !"
fi
}
オリジナルポスト
これが私のアイデアです-.bashrc
の関数を使用します。基本原則-/usr/bin/time
を使用して、コマンドの完了にかかる時間を測定し、15秒を超える場合は通知を送信します。
function measure ()
{
if [ $( /usr/bin/time -f "%e" $@ 2>&1 >/dev/null ) -gt 15 ]; then
notify-send "Hi , $@ is done !"
fi
}
ここでは、出力を/dev/null
にリダイレクトしていますが、出力を表示するには、ファイルにリダイレクトすることもできます。
はるかに優れたアプローチであるIMHOは、時間の出力をホームフォルダー内のファイルに送信することです(タイムファイルでシステムを汚染せず、常にどこを見ればよいかを常に把握できるようにします)。これがその2番目のバージョンです
function measure ()
{
/usr/bin/time --output=~/.timefile -f "%e" $@
if [ $( cat ~/.timefile | cut -d'.' -f1 ) -gt 15 ]; then
notify-send "Hi , $@ is done !"
fi
}
そして、最初と2番目のバージョンのスクリーンショットを、この順序で示します
最初のバージョン、出力なし
2番目のバージョン、出力あり
この目的に役立つツールを最近作成しました。ラッパーとして実行するか、シェル統合で自動的に実行できます。こちらをご覧ください: http://ntfy.rtfd.io
それをインストールするには:
Sudo pip install ntfy
ラッパーとして使用するには:
ntfy done sleep 3
通知を自動的に取得するには、これを.bashrc
または.zshrc
に追加します。
eval "$(ntfy Shell-integration)"
Bashを変更して、必要なラッパー機能を実装できます。
対話型シェルにこのような多くの変更を加える場合は、Emacs elispを使用して構築され、カスタマイズ性が高いeshellのような本質的にハッキング可能なシェルへの切り替えを検討できます。
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
スクリプトは非常にうまく機能します。 'Shebang'(#!/bin/bash
) 行を含めるようにしてください。 #!/bin/bash
の他のものは ここ に言及されていますが、ほとんどの場合、#!/bin/bash
はUnix bashスクリプトで正常に動作します。スクリプトインタープリターが必要とするため、スクリプトのタイプを認識します。
これはテストスクリプトとして機能するようです。
#!/bin/bash
start=$(date +%s);
echo Started
sleep 20;
echo Finished!
[ $(($(date +%s) - start)) -le 15 ] || notify-send -i dialog-warning-symbolic "Header" "Message"
このスクリプトを変更するには、echo
行とsleep
行がある場所にコマンドを配置します。
notify-send
に注意してください。-i
を使用してアイコンも指定できます:-)
また、最初にchmod +x /PATH/TO/FILE
を実行して、実行可能であることを確認してください。