假设我有一个make_ndx
通过-o
开关输出的程序。我想myprogram
从 bash shell 脚本调用并输出两个文件,out1.ndx
以及out2.ndx
. (myprogram
将一个字符串作为开关的输入-o
,并自动将文件扩展名附加.ndx
到该字符串。)因此,我编写了一个 bash shell 脚本:
#!/bin/bash
make_ndx -o out1
make_ndx -o out2
我获得两个输出文件:out1.ndx
和out2.ndx
.但我想获得out1.ndx
和out2.ndx
。
似乎
中的字符对应于换行符或返回字符(可能是\n
或\r
?),因为当我将文件名复制并粘贴到文本文件(或这篇文章)时,out1.ndx
显示为
out1
.ndx
(请注意,出于本文的目的,我使用另一个字符 (
) 来表示我在 SSH GUI 中看到的方形符号,因为当我将实际字符从 SSH GUI 复制到此处时,我只是获得了换行符特点。)
如何编写 bash shell 脚本以使换行符不会出现在第一个输出文件的文件名中?当我在调用之间添加额外的空格时,也会出现同样的问题make_ndx
:
#!/bin/bash
make_ndx -o out1
make_ndx -o out2
谢谢你的时间。
答案1
似乎有两种可能:
您将 \r 作为文件名的一部分传递。这通常不应该发生。如果您的文件中的 EOL 字符不匹配,则可能会发生这种情况。 Windows 使用 CRLF 对来结束文本文件中的一行; Unix 仅使用 LF。根据您编辑文件的方式,您可以设法在其中添加 CRLF,这会破坏各种情况。
另一个变体是,如果 out1 实际上来自变量 (
make_ndx -o "$out1"
),则您可能已捕获变量中的 LF。行动echo -n "$out1" | xxd -p
会让你知道你是否有;检查它是否以0a
.make_ndx
是越野车。该命令不会传递 \r,而是在内部插入它。您无法通过 bash 脚本执行任何操作(好吧,除了mv
修复名称之外)。如果您有源代码make_ndx
,您可以自己修复它,否则您需要联系支持它的人。
您可以通过多种方式检查混合行结尾。例如,如果您用于xxd
获取 bash 脚本的十六进制转储,0x0d
则为 CR (\r)。0x0a
是 LF (\n)。您不应在文件中看到任何 CR。