2010-03-24 16 views
9

Ich möchte Argumente aus der Datei als Befehlszeilenargumente für einige Befehle wie gcc oder ls verwenden.Wie werden Dateiinhalte als Befehlszeilenargumente verwendet?

Zum Beispiel gcc -o output -Wall -Werro

als Datei bestehen aus:

-o Ausgabe -Wall -Werro

gcc Kommandozeilenaufruf verwendet für.

+6

gcc $ enthalten (cat filename.txt) '- Könnte Zitate brauchen. –

Antwort

11

können Sie verwenden xargs:

cat optionsfile | xargs gcc 

Edit: Ich habe downvoted, weil Laurent nicht weiß, wie xargs funktioniert, also hier ist der Beweis:

$ 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 

Die -t Das Flag bewirkt, dass der Befehl vor der Ausführung in stderr geschrieben wird.

+1

@Laurent, das ist völlig falsch. Der Befehl, den ich geschrieben habe, führt 'gcc -o output -Wall -Werro' aus. Probieren Sie es selbst aus, wenn Sie es nicht glauben. –

+0

Schade, dass ich einen Kommentar nicht ablehnen kann. –

+4

Oder sogar "xargs gcc Sean

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

Beachten Sie, dass dies Backticks sind, keine einfachen Anführungszeichen. – tomfanning

4

I $() zusammen mit Katze mit empfehlen:

gcc $(cat file) 

Das schöne an $() über Backticks (die klassische Art und Weise), ist, dass es einfacher zu Nest ist eine innerhalb eines anderen :

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

+1, nisten Backticks ist ein Schmerz. –

+0

Alles, was modern genug ist, um die '$()' -Syntax zu verstehen, weiß auch, wie man die Datei selbst öffnet und umleitet, wodurch die Notwendigkeit eines nutzlosen 'cat'-Prozesses vermieden wird. Zum Beispiel wird 'gcc $ (

2

Die meiste Zeit, Befehl sub ordnung (entweder durch Backticks oder $(), wie andere hingewiesen haben) ist in Ordnung, aber hüte dich vor Shell Erweiterungsregeln. Denken Sie insbesondere daran, dass das Abwählen vor erfolgt und die Wortaufteilung nach Befehlsersetzung erfolgt. Diese

ist nicht so schlimm, wenn alle Argumente Worte sind, aber wenn Sie beginnen Leerzeichen oder andere Sonderzeichen setzen, die in Ihre Argumente zitierte würde normalerweise werden müssen, dann können Sie mit seltsamen Ergebnissen treffen (man beachte die abnormal Abstand und Zitate in der Ausgang):

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

den ganzen Befehl subtitution zitiert ist keine Lösung, offensichtlich, wie sie Wort Spaltung verhindern würden (also Ihre ganze Inhalt der Datei erscheint stattdessen als ein langes Argument von vielen Optionen), und würde nichts über die Zitate tun.

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

Eine Lösung, um dies ist die eval builtin zu verwenden:

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

N. B .: Echo kann nicht der beste Beispiel Befehl hier sein; Vielleicht möchten Sie durch etwas anderes ersetzen, z.die folgende Funktion:

$ f() { echo $#; } 
15

Einige Programme verwenden, um die „@“ Semantik args einzuspeisen aus einer Datei zB. gcc @argfile

Wo, für gcc, argfile enthält Optionen

-ansi 
-I/usr/include/mylib 

Diese verschachtelt werden können, so dass argfile

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

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

+0

+1 Sieht so aus, als ob dies der kanonische Weg ist. Schade, dass die [UUOCs] (http://partmaps.org/era/unix/award.html#uuk9letter) gewonnen haben;) – l0b0

+0

Ich stimme zu - das ist der beste Weg, es zu tun, mit gcc. Die Xargs-Lösung folgt meiner Meinung nach. Es hat den zusätzlichen Bonus, mit jedem Programm zu arbeiten. –

+0

Dies hat auch den Vorteil, das 8196 Zeichen-Limit in cmd.exe zu umgehen. – lama12345

Verwandte Themen