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


11

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

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

但这不起作用。我要执行的操作是使用HERE文件作为mpirun命令的输入,然后将输出传递给tail命令。但是,我认为这里的文件和尾部输出变得混乱了。

我应该如何编写此代码,使其符合我的要求?

Answers:


12

您在第一行中编写的内容看起来像一个完整的命令(shell术语中的“(化合物)列表”),因此shell将其视为完整的命令。由于这里有一个此处文档开始标记(<<END),因此外壳程序将读取此处文档的内容,然后启动一个新命令。如果要将此处文档放在列表的中间,则需要向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

最后一个!“迷惑” ..你不是在开玩笑!:) ..我偶然发现了硬换行符的想法,但实际上将等分的方括号平分到了bizzare上。.这是设计使然还是偶然的?(例如,是否有真正的用途?...您甚至可以在第一条“软”行中添加多个用分号分隔的命令。)
Peter.O 2011年

@fred:只是一个巧合。关于heredoc的开始和停止位置必须有一些规则。这里的规则是,heredoc就像是附加到该<<END位之后的下一个换行符的单个令牌。反斜杠换行符会使换行符无效。
吉尔(Gilles)'所以

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.