2010-03-24 11 views

risposta

11

È possibile utilizzare xargs:

cat optionsfile | xargs gcc 

Edit: Ho downvoted perché Laurent non sa come xargs opere, ecco la prova:

$ echo "-o output -Wall -Werro" > optionsfile 
$ cat optionsfile | xargs -t gcc 
gcc -o output -Wall -Werro 
i686-apple-darwin10-gcc-4.2.1: no input files 

Il -t flag fa in modo che il comando venga scritto su stderr prima dell'esecuzione.

+1

@Laurent, che è completamente falso. Il comando che ho scritto esegue 'gcc -o output -Wall -Werro'. Provalo tu stesso se non ci credi. –

+0

Peccato che non riesca a muovere un commento. –

+4

O anche "xargs gcc Sean

8
gcc `cat file.with.options` 
+1

Nota quelli sono i backtick, non le virgolette singole. – tomfanning

4

mi consiglia di utilizzare $() insieme a gatto:

gcc $(cat file) 

La cosa bella di $() sopra apici inversi (il modo classico) è che è più facile per nidificare uno all'interno di un altro :

gcc $(cat $(cat filename)) 
+0

+1, i backtick di annidamento sono un dolore. –

+0

Qualsiasi cosa abbastanza moderna da comprendere la sintassi '$()' sa anche come aprire e reindirizzare il file stesso, evitando la necessità di un inutile processo 'cat'. Ad esempio, 'gcc $ (

2

La maggior parte del tempo, comando secondario l'iterazione (tramite i backtick o $(), come altri hanno sottolineato) va bene, ma attenzione alle regole di espansione della shell . In particolare, tieni presente che lo smantellamento viene effettuato prima dello e la suddivisione in parole viene eseguita dopo la sostituzione del comando.

Questo non è troppo male se tutti i tuoi argomenti sono parole, ma se si iniziare a mettere spazi o altri caratteri speciali che normalmente bisogno di essere citato nei vostri argomenti, allora si può incontrare con risultati strani (notare l'anomala la spaziatura e citazioni in l'uscita):

$ echo "foo 'bar baz'" >a 
$ echo $(cat a) 
foo 'bar baz' 

Citando l'intero comando di subtitution non è una soluzione, ovviamente, in quanto impedirebbe la suddivisione delle parole (da qui, il contenuto di tutta la vostra del file apparirebbe come un argomento a lungo, invece di molti opzioni) e non farebbe nulla per le virgolette.

$ echo "$(cat a)" 
foo 'bar baz' 

Una soluzione aggirare questo è di utilizzare la funzione interna eval:

$ eval echo "$(cat a)" 
foo bar baz 

NB .: eco non può essere la migliore comando esempio qui; potresti voler sostituire con qualcos'altro, ad es.la seguente funzione:

$ f() { echo $#; } 
15

Alcuni programmi utilizzano i "@" semantica per alimentare in args da un file ad es. gcc @argfile

Dove, per gcc, argfile contiene opzioni

-ansi 
-I/usr/include/mylib 

Questo può essere nidificato in modo che argfile può contenere

-ansi 
-I/usr/include/mylib 
@argfile2 

http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Overall-Options.html#Overall-Options

+0

+1 Sembra che questo sia il modo canonico per farlo. Peccato che [UUOC] (http://partmaps.org/era/unix/award.html#uuk9letter) abbia vinto;) – l0b0

+0

Sono d'accordo: questo è il modo migliore per farlo, con gcc. La soluzione xargs segue, secondo me. Ha il vantaggio aggiuntivo di lavorare con qualsiasi programma. –

+0

Questo ha anche il vantaggio di aggirare il limite di 8196 caratteri in cmd.exe – lama12345

Problemi correlati