通过 bash shell 脚本对程序进行多次调用

通过 bash shell 脚本对程序进行多次调用

假设我有一个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.ndxout2.ndx.但我想获得out1.ndxout2.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

似乎有两种可能:

  1. 您将 \r 作为文件名的一部分传递。这通常不应该发生。如果您的文件中的 EOL 字符不匹配,则可能会发生这种情况。 Windows 使用 CRLF 对来结束文本文件中的一行; Unix 仅使用 LF。根据您编辑文件的方式,您可以设法在其中添加 CRLF,这会破坏各种情况。

    另一个变体是,如果 out1 实际上来自变量 ( make_ndx -o "$out1"),则您可能已捕获变量中的 LF。行动echo -n "$out1" | xxd -p会让你知道你是否有;检查它是否以0a.

  2. make_ndx是越野车。该命令不会传递 \r,而是在内部插入它。您无法通过 bash 脚本执行任何操作(好吧,除了mv修复名称之外)。如果您有源代码make_ndx,您可以自己修复它,否则您需要联系支持它的人。

您可以通过多种方式检查混合行结尾。例如,如果您用于xxd获取 bash 脚本的十六进制转储,0x0d则为 CR (\r)。0x0a是 LF (\n)。您不应在文件中看到任何 CR。

相关内容