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
相关产品推荐
相关产品推荐

