73062
MacOS 10.14.6 上で以下のようなシェルスクリプトをcronとlaunchdで実行させてみたのですが、gdateで期待しない値が返ってきました。  
コンソールからシェルスクリプトをマニュアルで実行した場合は期待通りの値が返ってきます。

cronまたはlaunchdでgdateから期待通りの値を取得する方法をご存知でしたらご教示いただけないでしょうか。

## date_cron.sh

```

    #!/bin/sh
    
    gdate_hour=`gdate -d '3 hours ago' +'%H'`
    date_hour=`date +'%H'`
    
    echo "gdate_hour=${gdate_hour}" > result.txt
    echo "date_hour=${date_hour}" >> result.txt
    
```

## result.txtに書き込まれた内容

### cronまたはlaunchdで11時台に実行した場合

```

    gdate_hour=
    date_hour=11
    
```

### コンソールからマニュアルでシェルスクリプトを実行した場合

```

    gdate_hour=08
    date_hour=11
    
```

なお、crontabおよびlaunchdの設定内容は以下の通りです。

### crontab

```

    */1 * * * * cd /Users/hoge; /bin/sh date_cron.sh
    
```

### launchd

```

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>date_cron</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/Users/hoge/date_cron.sh</string>
        </array>
        <key>StartInterval</key>
        <integer>60</integer>
        <key>WorkingDirectory</key>
        <string>/Users/hoge</string>
        <key>StandardOutPath</key>
        <string>/Users/hoge/date_cron.out</string>
        <key>StandardErrorPath</key>
        <string>/Users/hoge/date_cron.err</string>
    </dict>
    </plist>
    
```
CC BY-SA 4.0
2021-01-04T03:14:47.853
73056
2021-01-04T07:01:12.620
2021-01-04T03:49:06.323
15631
15631
question
macos shellscript cron
MacOSのcronまたはlaunchdでgdateが正しく動かない
CRONで実行する場合、ログイン時の設定は読み込まれません。  
今回のケースはgdateのパスが通っていなかったようです。  
CRONで実行するコマンドやCRONで実行されるスクリプト内で起動するコマンドを完全パス名で記述すると、パスが通っていないコマンドでも実行できます。

コマンドによっては環境変数によって挙動が変わるものもあるので、起動するスクリプトで明示的に設定を読み込む必要があるかもしれません。
CC BY-SA 4.0
2021-01-04T07:01:12.620
73062
2021-01-04T07:01:12.620
35558
73056
answer