Atコマンドの設定に使用したコードはここにあります
at -f noti.sh -t ${sleepTimes[$i]}
atq
で正常にリストされたジョブを確認できるため、時間は正しく機能します。
ファイルnoti.shは、atコマンドが使用されているのと同じディレクトリにあり、次のものが含まれています。
if [[ "$OSTYPE" == "linux-gnu" ]]; then
notify-send "Insomnia" "Time to take a rest" -u critical -t 7000 -i sleep.ico
Elif [[ "$OSTYPE" == "darwin"* ]]; then
terminal-notifier -title "Insomnia" -message "Time to take a rest" -sound "default" -group rest -timeout 7 -appIcon sleep.png
fi
Terminal-notifierとnotify-sendの両方が、これをテストしてきたそれぞれのプラットフォームにインストールされています。関数が本来の方法で実行されないのはなぜですか(通知バブルが表示されます)?
あなたの問題はこれかもしれません(man at
から):
説明
at
およびbatch
は、後で実行される標準入力または指定されたファイルからコマンドを読み取りますsing/bin/sh
。
また、たとえばat -f noti.sh -t 2...
を実行すると、次のような警告が出力されます。
warning: commands will be executed using /bin/sh
job 4 at Mon May 8 13:51:00 2017
Debianの/bin/sh
は/bin/dash
へのシンボリックリンクです。スクリプトをbash
でテストしたと思いますが、これにはいくつかの POSIXで定義されていない機能 があります。つまり、dash
で、または一般的には/bin/sh
で動作しません。 。
特定のケースでは、問題は[[ ]]
とOSTYPE
であり、これらはdash
ではサポートされていません。実行してみてください
$ sh noti.sh
次のエラーが返されます
noti.sh: 2: noti.sh: [[: not found
noti.sh: 4: noti.sh: [[: not found
一方、bash
を指定してスクリプトを実行すると、必要な処理が実行されます。
意図したとおりにスクリプトを実行するには、/bin/sh
(この場合はdash
)と互換性があるようにスクリプトを書き直す必要がある場合があります。これに関するヘルプについては、 www.shellcheck.net を参照してください。