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

WSL Ubuntu中Shell脚本首次cat报错文件不存在但最后cat正常

问题分析与解决

问题根源

错误提示里的'test.txt'$'\r'明确说明:你传递的文件名参数$1实际是test.txt\r(末尾带Windows回车符\r)。这不是目标文件test.txt的问题,而是你的脚本文件delfile.sh本身使用了Windows CRLF换行符。

当WSL的bash执行Windows格式的脚本时,会把每行末尾的\r当成命令/参数的一部分。比如脚本里的cat "$1"会被解析成cat "test.txt\r",自然找不到文件;而最后一条cat "$1"能正常执行,是因为前面的sed -i.bak命令在执行时,内部对路径做了隐式处理,属于偶然现象。

解决方案

1. 转换脚本文件的换行符为Linux格式

执行以下命令,移除脚本文件每行末尾的\r:

sed -i 's/\r$//' delfile.sh

如果你的WSL环境安装了dos2unix工具,也可以用更简洁的命令:

dos2unix delfile.sh

2. 验证转换结果

用cat -A命令查看脚本的换行符,正常的Linux格式脚本每行结尾应该显示$,而不是Windows格式的^M$:

cat -A delfile.sh

3. 重新执行脚本

现在再运行你的命令,就能正常工作了:

bash delfile.sh test.txt I

额外说明

你之前处理test.txt的换行符是多余的,目标文件的换行符不影响脚本对它的读取操作。真正的问题出在脚本文件本身的格式上——Windows和Linux的换行符差异会直接影响bash对脚本命令的解析。

内容的提问来源于stack exchange,提问作者Shikhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:54:58