ここにあるファイルを使用し、コマンドの出力をリダイレクトします


11

バッチスクリプトに次のコードがあります。

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

しかし、それは機能していません。HEREファイルをmpirunコマンドへの入力として使用し、出力をtailコマンドにパイプ処理することで行います。しかし、私はここのファイルとテール出力のものが混乱していると思います。

私が望むようにこれを書くにはどうすればよいですか?

回答:


12

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

最後です!"難読化" ..冗談ではない!:) ..私はハードニューラインのアイデアに出くわしましたが、実際にそのような括弧で囲まれたブロックを二分することは奇妙なことです..これは設計によるものですか、それとも偶然の一致ですか?(例えばこのため、実際の使用がある...そしてあなたが実際にも、複数のセミコロンは、その最初の「ソフト」の行でコマンドを区切って置くことができます..?
Peter.O

@fred:偶然の逸脱です。ヒアドキュメントの開始と停止の場所については、いくつかのルールが必要です。ここでのルールは、ヒアドキュメントが、<<ENDビットの後の次の改行トークンに接続された単一のトークンのようなものであるということです。バックスラッシュと改行は改行を無効にします。
Gilles「SO-邪悪なことをやめなさい」

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.