Usa il file HERE e reindirizza l'output del comando


11

Ho il seguente codice in uno script batch:

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

Ma non funziona. Quello che voglio che faccia è usare il file HERE come input per il comando mpirun, quindi reindirizzare l'output al comando tail. Tuttavia, penso che il file HERE e le cose in coda vengano confuse.

Come dovrei scrivere questo in modo che faccia quello che voglio?

Risposte:


12

Quello che hai scritto nella prima riga sembra un comando completo (un "elenco (composto)" nella terminologia della shell), quindi la shell lo considera come un comando completo. Poiché esiste un marcatore di inizio qui ( <<END), la shell legge quindi il contenuto del documento qui e quindi avvia un nuovo comando. Se vuoi mettere il documento qui nel mezzo di un elenco, devi indicare alla shell che l'elenco non è finito. Ecco un paio di modi.

mpirun -np 6 ./laplace <<END |

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

END
} | tail -n 1 > output

Oppure, ovviamente, puoi assicurarti che il comando si adatti perfettamente alla prima riga.

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

END

La regola da ricordare è che il contenuto del documento qui inizia dopo la prima riga non quotata dopo l' <<ENDindicatore. Ad esempio, ecco un altro modo offuscato di scrivere questo script:

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

END
             echo 1) > output

Quest'ultimo! "offuscato" .. Non stai scherzando! :) .. Mi ero imbattuto nell'idea di newline dura, ma in realtà dividere in due un blocco tra parentesi simile a quello sta rasentando il bizzare .. È questo di progettazione o è un'abberazione casuale ?. (es. c'è un reale utilizzo per questo? ... e puoi addirittura inserire più comandi separati da due punti e virgola in quella prima linea "morbida".
Peter.O

@fred: solo un'aberrazione casuale. Ci deve essere una regola su dove inizia e si ferma l'ereditarietà. Qui la regola è che l'ereditarietà è come un singolo token collegato al token newline successivo dopo il <<ENDbit. Una barra rovesciata-newline annulla la newline.
Gilles 'SO- smetti di essere malvagio'

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.