Gunakan file SINI dan redirect output dari perintah

11

Saya memiliki kode berikut dalam skrip batch:

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

Tapi itu tidak berhasil. Yang ingin saya lakukan adalah menggunakan file HERE sebagai input ke perintah mpirun, dan kemudian menyalurkan output ke perintah tail. Namun, saya pikir file SINI dan keluaran hal-hal semakin bingung.

Bagaimana saya harus menulis ini sehingga ia melakukan apa yang saya inginkan?

Robintw
sumber

Jawaban:

12

Apa yang Anda tulis di baris pertama terlihat seperti perintah lengkap (daftar "(gabungan)" dalam terminologi shell), jadi shell memperlakukannya sebagai perintah lengkap. Karena ada penanda mulai di sini-dokumen ( <<END), shell kemudian membaca konten di sini-dokumen, dan kemudian mulai perintah baru. Jika Anda ingin meletakkan dokumen di sini di tengah daftar, Anda perlu menunjukkan kepada shell bahwa daftar tersebut belum selesai. Berikut ini beberapa cara.

mpirun -np 6 ./laplace <<END |

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

END
} | tail -n 1 > output

Atau, tentu saja, Anda dapat memastikan perintah benar-benar cocok di baris pertama.

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

END

Aturan yang perlu diingat adalah bahwa konten di sini-dokumen dimulai setelah baris pertama yang tidak dikutip setelah <<ENDindikator. Misalnya, berikut ini cara lain yang membingungkan untuk menulis skrip ini:

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

END
             echo 1) > output
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Yang terakhir! "dikaburkan" .. Anda tidak bercanda! :) .. Saya telah menemukan ide garis keras, tetapi untuk membagi dua blok yang diberi tanda kurung seperti yang ada di bizzare .. Apakah ini dengan desain, atau apakah ini sebuah penghancuran kebetulan ?. (mis. adakah yang benar-benar digunakan untuk ini? ... dan Anda bahkan dapat menempatkan beberapa perintah terpisah semi-colon pada baris "soft" yang pertama ..
Peter.O
@ Fred: Hanya penyimpangan kebetulan. Harus ada aturan di mana heredoc mulai dan berhenti. Di sini aturannya adalah bahwa heredoc adalah seperti token tunggal yang melekat pada token baris baru berikutnya setelah <<ENDbit. Garis miring terbalik-baris baru membatalkan baris baru.
Gilles 'SANGAT berhenti menjadi jahat'
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
nix
sumber