2010-03-24 5 views

Répondre

11

Vous pouvez utiliser xargs:

cat optionsfile | xargs gcc 

Edit: J'ai downvoted parce que Laurent ne sait pas comment fonctionne xargs, voici donc la preuve:

$ 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 

Le -t L'indicateur provoque l'écriture de la commande à stderr avant l'exécution.

+1

@Laurent, c'est complètement faux. La commande que j'ai écrite exécute 'gcc -o output -Wall -Werro'. Essayez-le vous-même si vous ne le croyez pas. –

+0

Dommage que je ne puisse pas rétrograder un commentaire. –

+4

Ou même "xargs gcc Sean

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

Notez que ce sont des backticks, pas des guillemets simples. – tomfanning

4

Je recommande d'utiliser $() avec chat:

gcc $(cat file) 

La bonne chose à propos $() sur les apostrophes inverses (la voie classique) est qu'il est plus facile d'imbriquer l'un dans l'autre :

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

+1, l'endormissement en arrière est une douleur. –

+0

Tout ce qui est suffisamment moderne pour comprendre la syntaxe '$()' sait aussi comment ouvrir et rediriger le fichier lui-même, évitant ainsi le recours inutile à un processus 'cat'. Par exemple, 'gcc $ (

2

La plupart du temps, commande sub stitution (soit par des guillemets ou $(), comme d'autres l'ont souligné) est bien, mais méfiez-vous de shell règles d'expansion. Surtout, gardez à l'esprit que le désarmement est fait avant et que la division des mots est terminée après substitution de commande.

Ce n'est pas trop mal si tous vos arguments sont des mots, mais si vous commencer à mettre des espaces ou d'autres caractères spéciaux qui doivent normalement être cité dans vos arguments, alors vous pouvez rencontrer avec des résultats étranges (notez l'anormal espacement et citations dans la sortie):

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

Citant toute commande subtitution est pas une solution, évidemment, car il empêcherait le fractionnement mot (par conséquent, l'ensemble de votre contenu de fichier apparaît comme une longue discussion au lieu de nombreux options), et ne ferait rien au sujet des citations.

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

Une solution autour est d'utiliser le eval builtin:

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

l'écho de ne pas être N.B. la meilleure commande exemple ici; vous pourriez vouloir le remplacer par autre chose, par exemple .la fonction suivante:

$ f() { echo $#; } 
15

Certains programmes utilisent la sémantique de « @ » pour se nourrir dans args d'un fichier par exemple. gcc @argfile

Où, pour gcc, argfile contient des options

-ansi 
-I/usr/include/mylib 

Cela peut être imbriquée de sorte que argfile peut contenir

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

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

+0

+1 On dirait que c'est la façon canonique de le faire. Dommage que [UUOCs] (http://partmaps.org/era/unix/award.html#uuk9letter) a gagné;) – l0b0

+0

Je suis d'accord - c'est la meilleure façon de le faire, avec gcc. La solution xargs suit, à mon avis. Il a l'avantage supplémentaire de travailler avec n'importe quel programme. –

+0

Cela a également l'avantage de contourner la limite de 8196 caractères dans cmd.exe – lama12345

Questions connexes