6

したがって、スクリプトのこの部分が機能しないという問題があります。何が起こっているのか正確にはわかりませんが、変数内の特定の文字をエスケープしていないためだと感じています。運が悪かったので、次のことを試しました:

crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab -

各変数の内容は次のとおりです。

CTMP 変数は、crontab ファイルの 1 行です。

CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh'

FREQ変数は、cron ファイルの分単位の時間設定です。

FREQ=5

DIR 変数は現在の作業ディレクトリです

DIR='/home/admin/whatever'

SCRIPT 変数は単なるスクリプト ファイル名です。

SCRIPT='test.sh'

問題は、上記のこれらの変数内で必要な文字をエスケープしていないため、sed ステートメントが crontab ファイルを更新していないことだと思います。

それは正しいですか、それとも何か間違っていますか?

* アップデート *

CTMPESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC && \./$SCRIPTESC%" | crontab -

* アップデート *

これがcrontab出力です

*/10 * * * * cd /home/administrator/anm-1.5.0 */7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh

また、トラブルシューティングのために、エスケープされた 3 つの変数をエコーし​​ました。

\*/7 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh
/home/administrator/anm-1\.5\.0
anm\.sh

エスケープされた 3 つの変数は、実際には見栄えがします。

* アップデート *

置換前の cron ファイル:

*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh

置換後の cron ファイル:

*/7 * * * * cd /home/administrator/anm-1.5.0 */10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh

どういうわけかそこに投げ込まれたすべての余分なジャンクを参照してください?

4

1 に答える 1

9

はい、量指定子として$CTMP解釈されるアスタリスクが問題に含まれている可能性があります。も特殊文字です。それらをエスケープしてみてください:sed.

CTMP_ESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")

CTMP_ESCの代わりに使用しCTMPます。

また、区切り文字として使用していないため、コマンドでエスケープする必要はありません/seds///

編集:「一致した文字列」として解釈される&ため、置換でエスケープする必要もあります。したがって、スクリプトは次のようになります。sed&

CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab -
于 2013-06-24T10:28:06.333 に答える