cygwin awk打印将奇怪的字符添加到文件名

dmo*_*ohr 0 bash awk cygwin

我在Windows计算机上使用Cygwin来从远程Linux计算机上获取一些信息,并将结果写入文件。这是我的命令:

ssh user@remotemachine ps -aef | grep vnc | grep -v grep | awk '{print "<size>"$11"<\/size>""\n""<colorDepth>"$13"<\/colorDepth>"}' > myfile.txt
Run Code Online (Sandbox Code Playgroud)

但是,当我然后跑步

ls -l
Run Code Online (Sandbox Code Playgroud)

在写入myfile.txt的目录上,它表明文件名实际上是myfile.txt吗? (带有问号)。多余字符来自哪里,如何获取打印代码以正确命名文件,就像myfile.txt一样

我只需要运行另一个命令,例如

mv myfile.txt? myfile.txt
Run Code Online (Sandbox Code Playgroud)

要么

mv myfile.txt^M myfile.txt
Run Code Online (Sandbox Code Playgroud)

但是在我的bash脚本中似乎都找不到要重命名的文件(尽管有趣的是,我可以从终端(不在脚本中)开始输入

mv myf
Run Code Online (Sandbox Code Playgroud)

然后使用Tab键完成对文件的查找,然后使用新的文件名结束该行,并成功重命名了该文件。

Kei*_*son 5

您的脚本很可能使用Windows样式的行尾。该行的结尾看起来

... myfile.txt
Run Code Online (Sandbox Code Playgroud)

但这确实是:

... myfile.txt\r\n
Run Code Online (Sandbox Code Playgroud)

\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
Run Code Online (Sandbox Code Playgroud)

(我首先创建了一个备份副本,以防万一出问题,所以您不会破坏脚本。)