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

11

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

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, em seguida, canalizar a saída para o comando tail. No entanto, acho que o arquivo HERE e as saídas finais estão ficando confusas.

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

    
por robintw 16.05.2011 / 18:33

2 respostas

12

O que você escreveu na primeira linha parece um comando completo (uma “lista (composta)” na terminologia do shell), então o shell o trata como um comando completo. Como há um marcador inicial do documento aqui ( <<END ), o shell lê o conteúdo do documento aqui e, em seguida, inicia um novo comando. Se você quiser colocar o documento here no meio de uma lista, você precisa indicar ao shell que a lista não está terminada. 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 ter certeza de que o comando se encaixa completamente na primeira linha.

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

A regra a ser lembrada é que o conteúdo do documento aqui é iniciado após a primeira nova linha sem aspas, após o indicador <<END . Por exemplo, aqui está outra maneira ofuscada de escrever esse script:

mpirun -np 6 ./laplace <<END \
| tail -n $(
…
END
             echo 1) > output
    
por 16.05.2011 / 19:06
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
    
por 16.05.2011 / 18:36