我在Windows计算机上使用Cygwin来从远程Linux计算机上获取一些信息,并将结果写入文件。这是我的命令:
ssh user@remotemachine ps -aef | grep vnc | grep -v grep | awk '{print "<size>"$11"<\/size>""\n""<colorDepth>"$13"<\/colorDepth>"}' > myfile.txt
但是,当我然后跑步
ls -l
在写入myfile.txt的目录上,它表明文件名实际上是myfile.txt吗? (带有问号)。多余字符来自哪里,如何获取打印代码以正确命名文件,就像myfile.txt一样
我只需要运行另一个命令,例如
mv myfile.txt? myfile.txt
要么
mv myfile.txt^M myfile.txt
但是在我的bash脚本中似乎都找不到要重命名的文件(尽管有趣的是,我可以从终端(不在脚本中)开始输入
mv myf
然后使用Tab键完成对文件的查找,然后使用新的文件名结束该行,并成功重命名了该文件。
您的脚本很可能使用Windows样式的行尾。该行的结尾看起来像
... myfile.txt
但这确实是:
... myfile.txt\r\n
\r\nWindows CR-LF行的结尾在哪里。Windows文本文件中的行应该以这种方式结束,但是Shell无法识别Windows样式的行结尾。它看到有效的文本行,但将CR字符视为行的一部分。因此将其视为"myfile.txt\r"文件名。
您是如何创建bash脚本文件的?如果使用Windows本机编辑器,则说明行尾。
许多编辑器(包括vim)将自动适应文件的行尾,因此您可能无法\r从编辑器中删除多余的内容。
并将lsCR等不可打印的字符显示为?。
file在脚本上运行可能会告诉您有关行结尾的信息。
通过dos2unix命令过滤脚本。(首先阅读手册页;与大多数文本过滤器不同,dos2unix它更新其输入文件而不是写入stdout。)
这也应该起作用:
mv foo.sh foo.sh.bad
tr -d '\r' < foo.sh.bad > foo.sh
chmod +x foo.sh
(我首先创建了一个备份副本,以防万一出问题,所以您不会破坏脚本。)
| 归档时间: | 
 | 
| 查看次数: | 1784 次 | 
| 最近记录: |