Використовуйте файл ТУТ і перенаправляйте вихід команди


11

У мене в пакетному скрипті є такий код:

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

Але це не працює. Я хочу це зробити - використовувати файл HERE як вхід до команди mpirun, а потім передавати висновок до хвостової команди. Однак, я думаю, що речі з файлом ТУТ та вихідні дані з хвоста заплутуються.

Як мені це написати, щоб воно робило те, що я хочу?

Відповіді:


12

Те, що ви написали в першому рядку, схоже на повну команду ("складний список" у термінології оболонки), тому оболонка трактує її як повну команду. Оскільки тут є маркер запуску тут-документа ( <<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біта. Новий рядок зворотної косої лінії анулює новий рядок.
Жил "ТАК - перестань бути злим"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.