You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 16:20:28