バッチスクリプトには次のコードがあります。
mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output
しかし、うまくいきません。私が望むのは、HEREファイルをmpirunコマンドの入力として使用し、出力をtailコマンドにパイプすることです。しかし、HEREファイルとtail出力が混乱しているようです。
希望の効果を得るにはどうすればいいですか?
答え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
答え2
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END