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

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

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

mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output

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

我应该如何写这个才能达到我想要的效果?

答案1

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

mpirun -np 6 ./laplace <<END |
END
tail -n 1 > output
{ mpirun -np 6 ./laplace <<END
END
} | tail -n 1 > output

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

mpirun -np 6 ./laplace <<END | tail -n 1 > output
END

要记住的规则是此处文档内容在<<END指示器后的第一个未加引号的换行符之后开始。例如,以下是编写此脚本的另一种混淆方式:

mpirun -np 6 ./laplace <<END \
| tail -n $(
END
             echo 1) > output

答案2

mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END

相关内容