C Shell: come eseguire un programma con argomenti non a riga di comando?
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?
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