2010-03-24 16 views
9

Chciałbym użyć argumentów z pliku jako argumentów linii poleceń dla niektórych poleceń, takich jak gcc lub ls.Jak używać zawartości pliku jako argumentów wiersza poleceń?

Na przykład gcc -o output -Wall -Werro

jako plik składa się z:

wyjściowego -o -Wall -Werro

Służy do wywołania gcc wiersza polecenia.

+6

'gcc $ (cat nazwa_pliku.txt) '- Może potrzebować ofert. –

Odpowiedz

11

Można użyć xargs:

cat optionsfile | xargs gcc 

Edit: Byłem downvoted ponieważ Laurent nie wie, jak xargs prace, tak oto dowód:

$ 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 

-t flaga powoduje, że polecenie zostanie zapisane przed wykonaniem polecenia na stderr.

+1

@ Laurent, to całkowicie nieprawda. Polecenie, które napisałem, wykonuje 'gcc -o output -Wall -Werro'. Spróbuj sam, jeśli w to nie wierzysz. –

+0

Szkoda, nie mogę zgodzić się z komentarzem. –

+4

Albo nawet "xargs gcc Sean

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

Należy pamiętać, że są to tylko odsunięcia, a nie pojedyncze cudzysłowy. – tomfanning

4

Polecam używanie $() wraz z kotem:

gcc $(cat file) 

Zaletą $() nad backticks (klasyczny sposób) jest to, że łatwiej jest jeden wchodzi inna :

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

+1, zagnieżdżanie tylnych strzałów to ból. –

+0

Wszystko, co jest na tyle nowoczesne, aby zrozumieć składnię '$()', również wie, jak otworzyć i przekierować sam plik, unikając potrzeby bezużytecznego procesu 'cat'. Na przykład 'gcc $ (

2

W większości przypadków polecenie sub stytucja (albo poprzez backticks lub $(), jak inni podkreślili) jest w porządku, ale strzeż się reguł ekspansji powłoki . W szczególności, należy pamiętać, że niecałkowitość jest wykonywana przed i podział słów jest wykonywany po zamianie polecenia.

To nie jest tak źle, jeśli wszystkie argumenty są słowa, ale jeśli rozpocząć wprowadzanie spacji ani innych znaków specjalnych, które normalnie muszą być podane do swoich argumentów, wówczas można spotkać z dziwnych wyników (zauważyć nieprawidłowe rozstaw i cytaty w wyjście):

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

Cytowanie cały subtitution polecenia nie jest rozwiązaniem, oczywiście, jak to zapobiec słowo podział (stąd zawartość Twojego całego plik byłby pojawiają się jako jeden długi argumentu zamiast z wielu ) i nie zrobi nic z cytatami.

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

Jedno rozwiązanie wokół to jest użycie polecenie wbudowane eval:

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

N.B .: echo nie może być najlepszym przykładem polecenia tutaj; możesz chcieć zamienić go na coś innego, np.następujące funkcje:

$ f() { echo $#; } 
15

Niektóre programy korzystać z „@” semantyki karmić w args z pliku np. gcc @argfile

przypadku gdy dla gcc, argfile zawiera opcje

-ansi 
-I/usr/include/mylib 

ten można zagnieżdżać tak że argfile może zawierać

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

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

+0

+1 Wygląda na to, że jest to kanoniczny sposób. Szkoda, że ​​wygrał [UUOCs] (http://partmaps.org/era/unix/award.html#uuk9letter);) – l0b0

+0

Zgadzam się - jest to najlepszy sposób, aby to zrobić, z gcc. Rozwiązanie xargs wynika, moim zdaniem. Ma dodatkową zaletę pracy z dowolnym programem. –

+0

Ma to również zaletę obejścia limitu znaków 8196 w cmd.exe. – lama12345

Powiązane problemy