回答:
1行目に記述したものは完全なコマンド(シェルの用語では「(複合)リスト」)のように見えるため、シェルはそれを完全なコマンドとして扱います。ヒアドキュメントの開始マーカー(<<END)があるため、シェルはヒアドキュメントの内容を読み取り、新しいコマンドを開始します。ヒアドキュメントをリストの真ん中に置きたい場合は、リストが終了していないことをシェルに示す必要があります。ここにいくつかの方法があります。
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
<<ENDビットの後の次の改行トークンに接続された単一のトークンのようなものであるということです。バックスラッシュと改行は改行を無効にします。