Sử dụng tập tin TẠI ĐÂY và chuyển hướng đầu ra của lệnh


11

Tôi có đoạn mã sau trong một tập lệnh bó:

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

Nhưng nó không hoạt động. Những gì tôi muốn nó làm là sử dụng tệp TẠI ĐÂY làm đầu vào cho lệnh mpirun, sau đó chuyển đầu ra sang lệnh đuôi. Tuy nhiên, tôi nghĩ rằng tập tin TẠI ĐÂY và đầu ra đuôi mọi thứ đang bị lẫn lộn.

Làm thế nào tôi nên viết cái này để nó làm những gì tôi muốn?

Câu trả lời:


12

Những gì bạn đã viết trong dòng đầu tiên trông giống như một lệnh hoàn chỉnh (một danh sách (hợp chất) liệt kê trong thuật ngữ shell), vì vậy shell này coi nó như một lệnh hoàn chỉnh. Vì có một điểm đánh dấu bắt đầu tài liệu ở đây ( <<END), trình bao sau đó đọc nội dung tài liệu ở đây và sau đó bắt đầu một lệnh mới. Nếu bạn muốn đặt tài liệu ở đây vào giữa danh sách, bạn cần chỉ ra cho trình bao rằng danh sách chưa kết thúc. Dưới đây là một số cách.

mpirun -np 6 ./laplace <<END |

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

END
} | tail -n 1 > output

Hoặc, tất nhiên, bạn có thể chắc chắn rằng lệnh hoàn toàn phù hợp trong dòng đầu tiên.

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

END

Quy tắc cần nhớ là nội dung tài liệu ở đây bắt đầu sau dòng mới không được trích dẫn đầu tiên sau <<ENDchỉ báo. Ví dụ, đây là một cách khác để viết kịch bản này:

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

END
             echo 1) > output

Đó là cái cuối cùng! "Bối rối" .. Bạn không đùa đâu! :) .. Tôi đã tình cờ phát hiện ra ý tưởng mới, nhưng để thực sự chia đôi một khối có khung như thế đang tràn ngập trên bizzare .. Đây có phải là do thiết kế, hay đó là một sự bỏ qua ngẫu nhiên?. (ví dụ: có sử dụng thực sự cho việc này không? ... và bạn thậm chí có thể đặt nhiều lệnh tách biệt nửa dấu hai chấm trong dòng "mềm" đầu tiên đó ..
Peter.O

@fred: Chỉ là một quang sai ngẫu nhiên. Phải có một số quy tắc về nơi mà di sản bắt đầu và dừng lại. Ở đây quy tắc là heredoc giống như một mã thông báo duy nhất được gắn vào mã thông báo dòng mới tiếp theo sau <<ENDbit. Một dấu gạch chéo ngược-newline vô hiệu hóa dòng mới.
Gilles 'SO- ngừng trở nên xấu xa'

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.