Verwenden Sie die HERE-Datei und leiten Sie die Befehlsausgabe um


11

Ich habe den folgenden Code in einem Batch-Skript:

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

Aber es funktioniert nicht. Ich möchte, dass die HERE-Datei als Eingabe für den Befehl mpirun verwendet wird und die Ausgabe dann an den Befehl tail weitergeleitet wird. Ich denke jedoch, dass die HERE-Datei und die Endausgabe verwirrt werden.

Wie soll ich das schreiben, damit es macht, was ich will?

Antworten:


12

Was Sie in der ersten Zeile geschrieben haben, sieht aus wie ein vollständiger Befehl (eine „(zusammengesetzte) Liste“ in der Shell-Terminologie), daher behandelt die Shell ihn als vollständigen Befehl. Da es eine Here-Document-Startmarkierung ( <<END) gibt, liest die Shell den Here-Document-Inhalt und startet dann einen neuen Befehl. Wenn Sie das Here-Dokument in die Mitte einer Liste stellen möchten, müssen Sie der Shell anzeigen, dass die Liste nicht fertig ist. Hier sind einige Möglichkeiten.

mpirun -np 6 ./laplace <<END |

END
tail -n 1 > output
{ mpirun -np 6 ./laplace <<END

END
} | tail -n 1 > output

Natürlich können Sie auch sicherstellen, dass der Befehl vollständig in die erste Zeile passt.

mpirun -np 6 ./laplace <<END | tail -n 1 > output

END

Die zu beachtende Regel lautet, dass der Inhalt des Dokuments nach dem ersten nicht zitierten Zeilenumbruch nach dem <<ENDIndikator beginnt . Hier ist zum Beispiel eine andere verschleierte Art, dieses Skript zu schreiben:

mpirun -np 6 ./laplace <<END \
| tail -n $(

END
             echo 1) > output

Das letzte! "verschleiert" .. Du machst keine Witze! :) .. Ich war über die Idee der harten Newline gestolpert, aber einen solchen Klammerblock tatsächlich zu halbieren, grenzt an das Bizzare .. Ist das beabsichtigt oder ist es eine zufällige Abberation?. (zB gibt es eine echte Verwendung dafür? ... und Sie können sogar mehrere durch Semikolon getrennte Befehle in diese erste "weiche" Zeile
einfügen

@fred: Nur eine zufällige Aberration. Es muss eine Regel geben, wo der Heredoc startet und stoppt. Hier gilt die Regel, dass der Heredoc wie ein einzelnes Token ist, das an das nächste Newline-Token nach dem <<ENDBit angehängt wird . Ein Backslash-Newline macht den Newline ungültig.
Gilles 'SO - hör auf böse zu sein'

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.