使用 HERE 文件并重定向命令的输出

rob*_*ntw 11 shell io-redirection

我在批处理脚本中有以下代码:

mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我想要它做的是使用 HERE 文件作为 mpirun 命令的输入,然后将输出通过管道传输到 tail 命令。但是,我认为 HERE 文件和尾部输出的东西变得混乱了。

我应该如何写这个才能让它做我想要的?

Gil*_*il' 12

您在第一行中编写的内容看起来像一个完整的命令(shell 术语中的“(复合)列表”),因此 shell 将其视为一个完整的命令。因为有一个 here-document 开始标记 ( <<END),shell 然后读取 here-document 的内容,然后启动一个新命令。如果要将 here-document 放在列表中间,则需要向 shell 指示列表未完成。这里有几种方法。

mpirun -np 6 ./laplace <<END |
…
END
tail -n 1 > output
Run Code Online (Sandbox Code Playgroud)
{ mpirun -np 6 ./laplace <<END
…
END
} | tail -n 1 > output
Run Code Online (Sandbox Code Playgroud)

或者,当然,您可以确保该命令完全适合第一行。

mpirun -np 6 ./laplace <<END | tail -n 1 > output
…
END
Run Code Online (Sandbox Code Playgroud)

要记住的规则是,here-document 内容在<<END指标后的第一个未加引号的换行符之后开始。例如,这是编写此脚本的另一种混淆方式:

mpirun -np 6 ./laplace <<END \
| tail -n $(
…
END
             echo 1) > output
Run Code Online (Sandbox Code Playgroud)


nix*_*nix 7

mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
Run Code Online (Sandbox Code Playgroud)