たとえば、15秒以上実行されたコマンドが対話型シェルで終了するたびにデスクトップ通知を受け取りたいです。
つまり、すべてのコマンドを次のようにラップしたい
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
これをbashで達成する最良の方法は何ですか?
たとえば、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
使用すると、潜在的に長期に余分な何かを追加することを忘れないようにせずに、(つまり、自動的に作業を含め、ために求めている正確に何をしています)コマンドの実行)。
sleep 30
が、通知はありません。
.bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
。これはバグのようです:github.com/jml/undistract-me/issues/23
私の知る限り、ラッパーが必要です。また、コマンドの実行時間が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
"$@"
ではありません$@
。大きな違い。
wrapper
入力するすべてのコマンドの前に書くことは避けたいです。
command; alert
より短い実際にあるwrapper command
:-)
notify-send
長期間失効させたくない場合は、notify-sendにカスタムタイムアウト(ミリ秒単位)を指定します。例notify-send --expire-time 999999999 ...
で~/.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
この質問に賞金をかけた人は言った:
「既存の回答はすべて、コマンドの後に追加のコマンドを入力する必要があります。これを自動的に行う回答が必要です。」
この問題の解決策を研究している間、私はスタックエクスチェンジからこの質問に出くわしました。これはCtrlJ一連のコマンドへのバインドを許可します:(Ctrla行の先頭に移動Ctrlm)
したがってENTER、以下に掲載する2番目の機能の本来の目的を維持しながら、オートコンプリートの機能と時間を測定するための個別のコマンドを取得します。
現在、私の~/.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番目のバージョン、出力あり
sudo lsof
主にでテストしましたping -c20 google.com
。
この目的に役立つツールを最近作成しました。ラッパーとして実行するか、シェル統合で自動的に実行できます。ここでチェックしてください:http : //ntfy.rtfd.io
それをインストールするには:
sudo pip install ntfy
ラッパーとして使用するには:
ntfy done sleep 3
通知を自動的に取得するには、これを.bashrc
またはに追加します.zshrc
:
eval "$(ntfy shell-integration)"
スクリプトは非常にうまく機能します。'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
最初に実行して、実行可能であることを確認してください。
Bashを変更して、必要なラッパー機能を実装できます。
インタラクティブシェルにこのような多くの変更を行う場合は、Emacs elispを使用して構築され、カスタマイズ可能なすべての機能を備えたeshellのような本質的にハッキング可能なシェルへの切り替えを検討できます。
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
このような単純なifステートメントでこれを行うこともできます
#!/bin/bash
START=$(date +%s)
TIME=$(($START+15))
ORIGINAL_COMMAND;
END=$(date +%s)
if [ $END -gt $TIME ]
then
notify-send "Task Completed"
fi
独自の変数名を使用できます。
これが機能することを確認できます。完了までに長い時間を要するコマンドと、そうでないコマンドを使用してテストしました。
スクリプトをに置き換えORIGINAL_COMMAND
て$@
実行することにより、任意のコマンドでこれを行うこともでき./script command
ます。
$((2+2))
bashビルトインであり、追加のプログラムを必要としません。3番目:スペースを含むコマンドでは機能しません。tl; dr:他の1歳の回答よりも悪い