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ファイルと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

関連情報