質問: cron(crontab)での定期ジョブ実行に関する質問です。 Mac(OSはSierra)で、crontabにジョブを設定してシェルスクリプトを動かしているのですが、シェルスクリプト内の日本語文字が処理できていないことに気づきました。 シェルスクリプト内に、ディレクトリを参照している箇所があって、ディレクトリ名に日本語が使われています。このスクリプト自体を直接ターミナルから実行すれば、正常に動きます。 また、crontabのジョブの記述にも、日本語が含まれていても普通に動きます。 ところが、crontabでそのスクリプトを定期実行しようとした場合だけ、日本語の部分がスキップされた状態になります。 これは、どのようにすれば解消するでしょうか。 よくわかりませんが、シェルスクリプト内に文字コードを明示的に記載したりするのでしょうか?
回答: ターミナルで使っている言語の設定(ロケールと言います)と cronで使っている言語の設定が異なるのが原因だと思います まずターミナル側のロケールを確認してください ロケールはターミナルからコマンドラインで "locale"コマンドを実行すれば わかります ``` $ locale LANG=ja_JP.UTF-8 (以下略) ``` と出れば "ja_JP.UTF-8" が設定されたロケールになります おそらくですが デフォルトのロケールは"ja_JP.UTF-8"とは別のもので crontabはそちらのロケールで動いていて 一方でターミナル側は ターミナルのアプリ(terminal.app等)が LANGを上書き設定してシェルを起動しているのだと思います たとえばターミナル側でも ``` export LANG=C ``` と実行して LANGを "ja_JP.UTF-8"以外に変更して それからシェルスクリプトを実行すると日本語のファイル名が使えなくなると思います 解決方法ですが,シェルスクリプト内に ``` export LANG=ja_JP.UTF-8 ``` を追加して,環境変数 LANGをターミナルのそれとおなじものにすれば ターミナルと同じ動作になると思います