bash脚本执行find命令时遭遇$'\r': command not found及-exec参数缺失错误
bash脚本执行find命令时遭遇$'\r': command not found及-exec参数缺失错误
我写了如下脚本(为了简化和隐私做了修改):
FILES_ROOT='/data/FILES' BACK_B2B_RETURNS_S="$FILES_ROOT"'/wms-m-company/w2z/b2breturns/backup' BACK_B2B_RETURNS_D="$FILES_ROOT"'/wms-d-company/w-to-z/backup/m-company/b2b-delivery-confirmations' find "$BACK_B2B_RETURNS_S" -maxdepth 1 -type f -exec mv {} "$BACK_B2B_RETURNS_D" \; LOG_B2B_RETURNS_S="$FILES_ROOT"'/wms-m-company/w2z/b2breturns/log' LOG_B2B_RETURNS_D="$FILES_ROOT"'/wms-d-company/w-to-z/backup/m-company/b2b-delivery-confirmations/log' find "$LOG_B2B_RETURNS_S" -maxdepth 1 -type f -exec mv {} "$LOG_B2B_RETURNS_D" \;执行脚本时出现以下错误:
-bash: $'\r': command not found -bash: $'\r': command not found find: missing argument to `-exec' Try 'find --help' for more information. -bash: $'\r': command not found find: missing argument to `-exec' Try 'find --help' for more information.我搞不懂为什么,正常情况下我会用终端调试,但现在不行——因为我把这些命令逐行复制到终端执行是没问题的。有人知道这个脚本哪里出问题了吗?
嘿,这个问题我太熟了!你遇到的麻烦根源其实很简单——你的脚本文件使用了Windows风格的换行符(CRLF,也就是\r\n),而Linux下的bash只识别Unix风格的换行符(LF,也就是\n)。
为什么会触发这些错误呢?
- 那些
$'\r': command not found的报错,这个\r就是Windows换行里的回车符,bash会把它当成命令的一部分,自然找不到对应的命令,所以报错。 - 至于
find: missing argument to '-exec',是因为你脚本里-exec结尾的;后面跟着\r,bash解析的时候把;\r当成了一个整体,find就认不出正确的;参数了,所以会提示参数缺失。
而你逐行复制到终端执行没问题,是因为终端会自动处理掉这些多余的\r,所以不会触发错误。
给你几个简单的解决办法,随便选一个都能搞定:
- 用
dos2unix工具转换脚本:dos2unix your_script.sh,这个工具专门用来处理Windows和Unix换行符的转换,大多数Linux发行版都能直接安装。 - 如果没有
dos2unix,用sed命令替换掉所有行尾的\r:sed -i 's/\r$//' your_script.sh - 用文本编辑器手动转换:比如VS Code右下角可以看到当前文件的换行符格式,点击改成
LF;或者用vim打开脚本后,输入:set fileformat=unix,然后:wq保存退出。
备注:内容来源于stack exchange,提问作者MaestroMaus
相关产品推荐
相关产品推荐

