我与ModelArts的故事 | 报错“$'\r': command not found”解决思路
环境
本地windows10&云上Ubuntu18.04
python3.8
pytorch1.13
问题现象
之前在跑一个ModArts文档的案例,因为会用到文档里的样例代码,所以先在本地windows环境新建了一个文件run.sh,然后把样例代码粘贴进去。
因为我的场景是代码存到云上SFS上、训练作业读取SFS的内容,所以把文件run.sh从本地windows传到SFS上(ubuntu18.04环境)。
然后运行在训练作业里运行run.sh,显示报错“$'\r': command not found”。
原因分析
报错内容是标红部分:
经过分析发现,/cache是在run.sh的这个位置:
报错是mkdir命令没权限创建“/cache\r”,仔细一看发现要创建的文件夹名字是不一样的!原代码含义是先定义了DIS_DATA_PATH的名字,然后创建一个DIS_DATA_PATH文件夹(即/cache),但是实际执行的时候缺变成了“/cache\r”,多了“\r”。
而且这个“\r”不仅出现在一个地方,前面的第2行第4行明明是空行没有内容,但是却依然报了这个错误。
说明文档里面默认加了"/r"的内容。
经过百度后发现,根因是windows文件与ubuntu文件是不一样的。如果直接把windows文件传到ubuntu上,会把“回车换行”解析成"\r"(并且我们肉眼识别不出这个内容)。
例如上文样例代码,实际代码内容会变成(末尾都会多出个\r):
# 创建run.sh\r
\r
#!/bin/bash
\r
# 从obs中下载数据到本地SSD盘
DIS_DATA_PATH=/cache\r
SRC_DATA_PATH=${imagenet数据集在obs中分享链接}\r
OBSUTIL_PATH=https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz\r
mkdir -p $DIS_DATA_PATH && cd $DIS_DATA_PATH && wget $OBSUTIL_PATH && tar -xzvf obsutil_linux_amd64.tar.gz && $DIS_DATA_PATH/obsutil_linux_amd64*/obsutil share-cp $SRC_DATA_PATH $DIS_DATA_PATH/ -ac=123456 -r -f -j 256 && cd -
所以DIS_DATA_PATH变成了“/cache\r”,而这个文件夹名字根本不符合规范,所以当然就没有权限了,导致报错。
处理方法
方法一:保持环境一致
直接在ubuntu环境下新建run.sh文件,从根源上解决系统不一致的问题。
方法二:手动删除“\r”
在ubuntu上进入run.sh所在文件夹,在terminal上执行下面的命令,手动删除“\r”。
sed -i 's/\r//' run.sh
——————————————————————————————————————————————————————
我正在参加【有奖征文第21期】说说你和ModelArts的故事,输出优质产品体验文章,赢开发者大礼包!
https://bbs.huaweicloud.com/blogs/395149
- 点赞
- 收藏
- 关注作者
评论(0)