web-dev-qa-db-ja.com

コマンドで実際に実行されていません

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の両方が、これをテストしてきたそれぞれのプラットフォームにインストールされています。関数が本来の方法で実行されないのはなぜですか(通知バブルが表示されます)?

3
A. Epstein

あなたの問題はこれかもしれません(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 を参照してください。

1
resc