Domanda

Il mio $ SHELL è tcsh. Voglio eseguire uno script di shell c che chiamerà un programma molte volte con alcuni argomenti cambiati ogni volta. Il programma che devo chiamare è in Fortran. Non voglio modificarlo. Il programma accetta argomenti solo una volta eseguito, ma non sulla riga di comando. Dopo aver chiamato il programma nello script, il programma prende il controllo (qui è dove sono bloccato attualmente, non posso mai uscire perché lo script non eseguirà nulla fino a quando il processo del programma non si interrompe); a questo punto ho bisogno di passargli alcune variabili, quindi dopo diverse iterazioni dovrò ctrl-c fuori dal programma e continuare con lo script.

Come si può fare?

È stato utile?

Soluzione

Per aggiungere ciò che ha detto @Toybuilder, puoi usare un " qui documento " ;. Cioè il tuo script potrebbe avere

./myfortranprogram << EOF
first line of input
second line of input
EOF

Tutto tra " <<EOF " e il " EOF " verrà inviato allo standard input del programma (Fortran usa ancora " read (5, *) " per leggere dallo standard input?)

E poiché penso che il commento di @ephemient meriti di essere nella risposta:

  

Alcuni altri suggerimenti: < < 'EOF' impedisce   interpolazione nel corpo qui-doc;   < < -EOF rimuove tutte le schede iniziali (quindi   puoi indentare il here-doc per abbinare   i suoi dintorni), e EOF può essere   sostituito da qualsiasi token. Un token vuoto   (< < " ") indica un here-doc che si ferma   alla prima riga vuota.

Non sono sicuro di quanto siano portatili, o se sono solo estensioni tcsh - ho usato solo il <=> tipo " qui documento " me stesso.

Altri suggerimenti

Quello che vuoi usare è Expect .

Uhm, puoi alimentare il tuo codice Fortran con un reindirizzamento? Puoi creare un file temporaneo con i tuoi input e quindi reindirizzarlo con il reindirizzamento stdin (& Lt;).

Non un tcsh utente, ma se il programma viene eseguito, legge i comandi tramite stdin quindi è possibile utilizzare il reindirizzamento della shell < per fornire i comandi richiesti. Se lo esegui in background con & non lo blocchi quando viene eseguito. Quindi puoi sleep per un po ', quindi utilizzare tutti gli strumenti che hai (ps, grep, awk, ecc.) Per scoprire il PID del programma, quindi utilizzare kill per inviarlo SIGTERM che è lo stesso di fare un ctrl-c.

Questo è un lavoro atteso dal programma unix, che può comandare in modo semplice e interattivo programmi e rispondere alle loro richieste.

Sono stato inviato qui dopo che mi è stato detto che la mia domanda era vicina a essere un duplicato di questo.

FWIW, ho avuto un problema simile con uno script shell csh C.

Questo bit di codice consentiva l'esecuzione del comando personalizzato_senza di ottenere QUALSIASI argomento di input:

foreach f ($forecastTimes)
    custom_command << EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
        EOF
end

Non ha funzionato la prima volta che l'ho provato, ma dopo aver ripulito tutto lo spazio bianco in quella sezione del codice ho rimosso lo spazio tra " < < " e il " EOF " ;. Ho anche spostato indietro il & Quot di chiusura; EOF & Quot; fino al margine sinistro. Successivamente ha funzionato:

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top