Use o arquivo HERE e redirecione a saída do comando

11

Eu tenho o seguinte código em um script em lote:

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

Mas não está funcionando. O que eu quero fazer é usar o arquivo HERE como entrada para o comando mpirun e canalizar a saída para o comando tail. No entanto, acho que o arquivo HERE e as saídas finais estão ficando confusos.

Como devo escrever isso para que ele faça o que eu quero?

robintw
fonte

Respostas:

12

O que você escreveu na primeira linha se parece com um comando completo (uma “lista (composta)” na terminologia do shell); portanto, o shell o trata como um comando completo. Como existe um marcador de início do documento aqui ( <<END), o shell lê o conteúdo do documento aqui e inicia um novo comando. Se você deseja colocar o documento aqui no meio de uma lista, é necessário indicar ao shell que a lista não está concluída. Aqui estão algumas maneiras.

mpirun -np 6 ./laplace <<END |

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

END
} | tail -n 1 > output

Ou, é claro, você pode garantir que o comando se encaixe completamente na primeira linha.

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

END

A regra a lembrar é que o conteúdo do documento aqui é iniciado após a primeira nova linha não citada após o <<ENDindicador. Por exemplo, aqui está outra maneira ofuscada de escrever este script:

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

END
             echo 1) > output
Gilles 'SO- parar de ser mau'
fonte
Aquele último! "ofuscado" .. Você não está brincando! :) .. Eu me deparei com a ideia de linha dura, mas na verdade dividir um bloco entre colchetes como esse está chegando ao bizzare .. Isso é intencional ou é uma aberração coincidente ?. (por exemplo, existe um uso real para isso? ... e você pode até colocar vários comandos separados por ponto-e-vírgula nessa primeira linha "suave".
Peter.O
@ Fred: Apenas uma aberração coincidente. Tem que haver alguma regra sobre onde o heredoc começa e para. Aqui a regra é que o heredoc é como um único token anexado ao próximo token da nova linha após o <<ENDbit. Uma barra invertida-nova linha anula a nova linha.
Gilles 'SO- stop be evil'
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
nix
fonte