これら2つのクローンの操作にはどのような問題がありますか? [コピー]

これら2つのクローンの操作にはどのような問題がありますか? [コピー]

次のcronジョブを定義しました。

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'

上記のコマンドをコマンドラインから直接実行すると正常に動作するようです。ところで今朝スクリプト実行を確認してみると、次のティックが正しく閉じられないという内容のメール(誤って削除して依頼したものです)をいただきました。

ベストアンサー1

cron 作業コマンドが対話型シェルに直接コマンドを入力するのとは異なる動作をする 3 つの一般的な理由は次のとおりです。

  • Cronは限られた環境、つまり最小限を提供し、$PATH他の予想変数が不足しています。
  • Cronはデフォルトで呼び出されますが、/bin/sh他のシェルを対話的に使用することもできます。
  • Cronは%この文字を特別に処理します(コマンドから改行文字に変換)。
  • Cronは端末やグラフィック環境を提供しません。

crontabファイルでは、%すべての文字の前に付ける必要があります\。これは、cronにコマンドにパーセントのみを入力するように指示します。dateクローン操作でこのコマンドを使用するときは、この点に注意してください。

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"

また、いくつかの引用問題も解決しました。

  • 読みやすさとは別に問題は発生しませんが、コマンドの置き換えにバックティックを使用しないでください。代替の使用$(…): 構文解析ルールはより簡単です。
  • 変数とコマンドの置換には常に二重引用符を使用してください"$somevariable""$(somecommand)"ここでは、dateコマンドが使用している型の特殊文字を返さないため、引用符がなくても問題はありません。ただし、どの文字が特殊であるかを注意深く覚えており、引用符がないすべての代替項目でこれを確認する必要があります。結果のフィールド分割とファイル名の生成を望まない限り、単純に保ち、常に二重引用符を使用してください。
  • 特定のコマンド置換への拡張を防ぐ一重引用符があります。代わりに二重引用符を使用してください。

おすすめ記事