我有一个小的bash脚本,在我的pi上工作,但由于某些原因在朋友的pi上踢出了错误。
最终的目标是下载一个文件,并重命名为另一个脚本使用。 这种情况每天发生4次,所以部分脚本在开始之前会删除之前的文件。 然后下载新的文件,然后重命名它,这样其他脚本就可以引用一个文件,而不是整天下载的所有四个文件。
下面是这个脚本。
#!/bin/bash
rm -r /NeoSectional/GFSMAV &
sudo wget https://www.weather.gov/source/mdl/MOS/GFSMAV.t00z -P /NeoSectional/
sleep 5
sudo mv /NeoSectional/GFSMAV.t00z /NeoSectional/GFSMAV
所以它应该删除GFSMAV这个文件
然后下载新文件GFSMAV.t00z,并将其放置在NeoSectional目录下。
等五秒钟
然后将名称从GFSMAV.t00z改为GFSMAV。
这是我在我朋友的pi上得到的输出。
getmos0.sh: line 2: $'\r': command not found
getmos0.sh: line 3: $'\r': command not found
--2020-04-22 11:50:03-- https://www.weather.gov/source/mdl/MOS/GFSMAV.t18z
Resolving www.weather.gov (www.weather.gov)... 23.1.244.20, 2600:1406:3c:498::116, 2600:1406:3c:497::116
Connecting to www.weather.gov (www.weather.gov)|23.1.244.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3198792 (3.0M) [text/plain]
Saving to: ‘/NeoSectional/\r/GFSMAV.t18z.1’
GFSMAV.t18z.1 100% [============================================================>] 3.05M 1.72MB/s in 1.8s
2020-04-22 11:50:05 (1.72 MB/s) - ‘/NeoSectional/\r/GFSMAV.t18z.1’ saved [3198792/3198792]
sleep: invalid time interval ‘5\r’
Try 'sleep --help' for more information.
mv: cannot stat '/NeoSectional/GFSMAV.t18z': No such file or directory
由于某些原因,它最终创建了一个名为''$'\r'的目录。
而且它在删除文件时出错了,它试图把文件放到NeoSectinoal\r中,然后因为它放到那个奇怪的目录中,所以它在最后才mv。
我们有chmod +x的bash文件。
有什么办法可以解决这个问题吗?
THANKS
我不知道你从上面的评论中是否清楚你的文件是 getmos0.sh
包含 \r\n
(回车和换行),而不是像在MS-DOS中那样,在每一行的末尾使用 \n
(行进)只像在Unix和Linux中一样。
他们给你的答案都以这个为目标。一个较短的方法是将所有的 \r
的文件,而不需要创建一个临时文件 tmp
是。
sed -i 's/\r$//' getmos0.sh
问题在于行分离
Windows使用换行(\n
)和回车(\r
)(两个字符),而linux只使用换行。
这个问题很可能是在将文件从windows复制到Raspberry Pi时发生的。这就导致了 \r
s,而当你试图执行它时,bash无法理解它。
你可以做以下工作之一
用文本编辑器在raspberry pi上打开文件,去掉所有行末的奇怪字符(尤其是类似于 ^M
或 \n
)如果有的话,删除换行符,然后重新创建(在编辑器中)
移除所有 \r
的命令,自动地使用类似 cat getmos0.sh | sed 's/\r$//' > tmp;mv tmp getmos0.sh
.
如果 fromdos
安装后,您可以直接运行 fromdos getmos0.sh
. 参见@Roadowl的评论。
你需要和脚本在同一个目录下,并且有写权限才能使用这些解决方案。