cron(crontab)での定期ジョブ実行に関する質問です。

Mac(OSはSierra)で、crontabにジョブを設定してシェルスクリプトを動かしているのですが、シェルスクリプト内の日本語文字が処理できていないことに気づきました。

シェルスクリプト内に、ディレクトリを参照している箇所があって、ディレクトリ名に日本語が使われています。このスクリプト自体を直接ターミナルから実行すれば、正常に動きます。
また、crontabのジョブの記述にも、日本語が含まれていても普通に動きます。
ところが、crontabでそのスクリプトを定期実行しようとした場合だけ、日本語の部分がスキップされた状態になります。

これは、どのようにすれば解消するでしょうか。
よくわかりませんが、シェルスクリプト内に文字コードを明示的に記載したりするのでしょうか?

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2017/01/10 23:02:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pyopyopyo No.1

回答回数377ベストアンサー獲得回数98

ポイント100pt

ターミナルで使っている言語の設定(ロケールと言います)と
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をターミナルのそれとおなじものにすれば
ターミナルと同じ動作になると思います

id:midnightseminar

localeの指定を追記したらできました!
ありがとうございました。

2017/01/09 10:17:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません