Используйте ЗДЕСЬ файл и перенаправьте вывод команды

11

У меня есть следующий код в пакетном скрипте:

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

Но это не работает. Я хочу использовать файл HERE в качестве входных данных для команды mpirun, а затем направить вывод в команду tail. Тем не менее, я думаю, что HERE файл и хвостовой вывод путаются.

Как мне написать это так, чтобы оно делало то, что я хочу?

robintw
источник

Ответы:

12

То, что вы написали в первой строке, выглядит как завершенная команда («(составной) список» в терминологии оболочки), поэтому оболочка рассматривает ее как завершенную команду. Так как есть маркер начала здесь-документа ( <<END), оболочка затем считывает содержимое здесь-документа и затем запускает новую команду. Если вы хотите поместить документ here в середину списка, вам нужно указать оболочке, что список еще не закончен. Вот несколько способов.

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
Жиль "ТАК - прекрати быть злым"
источник
Это последний! "запутанный" .. Ты не шутишь! :) ... Я наткнулся на идею новой строки, но на самом деле разделить блок в скобках, как будто он граничит с причудой ... Это из-за замысла или это случайное отклонение? (Например, есть ли реальное применение для этого? ... и вы даже можете поместить несколько команд,
разделенных точкой с запятой,
@fred: просто случайная аберрация. Должно быть какое-то правило относительно того, где и где начинается наследственность. Здесь правило состоит в том, что heredoc подобен одному токену, присоединенному к следующему токену новой строки после <<ENDбита. Обратная косая черта-новая строка аннулирует новую строку.
Жиль "ТАК - перестань быть злым"
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
шухер
источник