Linux
使用正則表達式執行包含 find 的腳本在 cron 中失敗,但在 shell 中執行
我的 /etc/cron.d 中有以下腳本:
19 15 * * * root /opt/scripts/clean-nexus-release-repo.sh
clean-nexus-release-repo.sh 腳本如下所示:
#!/bin/bash find /opt/sonatype-work/nexus/storage/releases/se/company* -regextype posix-extended -depth -regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}' -mtime +60 -type d -print -exec rm -r {} \; find /opt/sonatype-work/nexus/storage/releases/nu/company -regextype posix-extended -depth -regex '.*/r?[0-9]{5,7}[a-Z0-9_.-]*\.[0-9]{1,3}' -mtime +60 -type d -print -exec rm -r {} \;
當我從我的 shell 執行 clean-nexus-release-repo.sh 腳本時,一切正常。當它通過 cron 執行時,我得到以下輸出:
find: Invalid range end find: Invalid range end
這與我將
[a-Z0-9_.-]
正則表達式中的連字元移動到無效位置時遇到的錯誤相同。我嘗試了以下方法,但仍然遇到相同的錯誤:
- 指定 find 命令的絕對路徑
- 用反斜杠轉義連字元
- 刪除該連字元
find --version
給出:find (GNU findutils) 4.4.2
在 Linux devtools01 2.6.32-71.el6.x86_64 上執行(CentOS Linux 6.0 版)
我不確定我可以在這裡給出完美的技術解釋。也許其他人可以改進答案。
基本上我記得範圍表達式是依賴於語言環境的,所以
$$ a-Z $$不一定意味著相同的事情$$ a-zA-Z $$ 我認為相關文件是:
http://www.gnu.org/software/grep/manual/grep.html#index-range-expression-216 :
在方括號表達式中,範圍表達式由兩個用連字元分隔的字元組成。它使用區域設置的整理順序和字元集匹配在兩個字元之間排序的任何單個字元,包括兩個字元。例如,在預設的 C 語言環境中,'
$$ a-d $$’ 等價於 ‘$$ abcd $$’。許多語言環境按字典順序對字元進行排序,並且在這些語言環境中$$ a-d $$’ 通常不等於 ‘$$ abcd $$’; 它可能相當於’$$ aBbCcDd $$’, 例如。要獲得括號表達式的傳統解釋,您可以通過將 LC_ALL 環境變數設置為值“C”來使用“C”語言環境。