Use el archivo AQUÍ y redirija la salida del comando

11

Tengo el siguiente código en un script por lotes:

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

Pero no está funcionando. Lo que quiero que haga es usar el archivo AQUÍ como entrada para el comando mpirun y luego canalizar la salida al comando de cola. Sin embargo, creo que el archivo AQUÍ y las cosas de salida de cola se están confundiendo.

¿Cómo debo escribir esto para que haga lo que quiero?

robintw
fuente

Respuestas:

12

Lo que ha escrito en la primera línea parece un comando completo (una "lista (compuesta)" en la terminología del shell), por lo que el shell lo trata como un comando completo. Como hay un marcador de inicio de documento aquí ( <<END), el shell lee el contenido del documento aquí y luego inicia un nuevo comando. Si desea colocar el documento aquí en el medio de una lista, debe indicar al shell que la lista no está terminada. Aquí hay un par de formas.

mpirun -np 6 ./laplace <<END |

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

END
} | tail -n 1 > output

O, por supuesto, puede asegurarse de que el comando encaje completamente en la primera línea.

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

END

La regla para recordar es que el contenido del documento aquí comienza después de la primera línea nueva sin comillas después del <<ENDindicador. Por ejemplo, aquí hay otra forma ofuscada de escribir este script:

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

END
             echo 1) > output
Gilles 'SO- deja de ser malvado'
fuente
Ese último! "ofuscado" .. No estás bromeando! :) .. Me había tropezado con la idea de la línea dura, pero en realidad bisecar un bloque entre corchetes como ese está bordeando el bizzare ... ¿Es esto por diseño, o es una aberración casual? (por ejemplo, ¿hay un uso real para esto? ... e incluso puedes poner múltiples comandos separados por punto y coma en esa primera línea "suave" ...
Peter
@fred: Solo una aberración casual. Tiene que haber alguna regla sobre dónde comienza y se detiene el heredoc. Aquí la regla es que el heredoc es como un token único adjunto al siguiente token de nueva línea después del <<ENDbit. Una barra invertida-nueva línea anula la nueva línea.
Gilles 'SO- deja de ser malvado'
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
nada
fuente