2012-11-12 16 views
5

jestem zupełnie zdezorientowany czytanie DOC Ruby system metody here. Nie jestem pewien, jakie są polecenia i jakie są opcje. Co mam zrobić, jeśli chcę wykonać następujące czynności?Ruby argumenty metoda System

wget -pk -nd -P /public/google www.google.com 

Ze względów bezpieczeństwa, chciałbym skorzystać z jednej z wersji, która nie używa powłoki (drugi i trzeci formy w adresie URL dałem, a nie pierwszym)

+1

Można użyć wycofań. – alex

+0

'file = system (wget -pk -nd -P/public/google www.google.com)'. Sprawdź ten http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – nicooga

+0

Przepraszam, zredagowałem, aby wyjaśnić, o co mi chodzi. –

Odpowiedz

10

Rozważmy przykładów:

system("echo *") 
system("echo", "*") 

pierwszy przechodzi ciąg 'echo *' do powłoki być analizowany i wykonywany; dlatego system('echo *') produkuje takie same dane wyjściowe, jak wypowiadanie echo * z wiersza powłoki: otrzymujesz listę plików w bieżącym katalogu. Odpowiednią formą argumentu jest:

commandline : command line string which is passed to the standard shell 

Druga powłoka całkowicie omija. Będzie szukać echo w PATH, a następnie wykona go z ciągiem '*' jako argumentem. Ponieważ powłoka rozwija symbole wieloznaczne (przynajmniej w systemach uniksowych), * pozostanie jako prosty *, a zobaczysz jako wynik wyjściowy *. Odpowiednia forma argumentem jest tutaj:

cmdname, arg1, ... : command name and one or more arguments (no shell) 

Trzecia forma:

[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell) 

jest używany, gdy chcemy wykonać cmdname ale mają to pokazać się z inną nazwą w ps ofert i takie. Możesz zobaczyć to w akcji otwierając dwa terminale. Otworzyć irb w jednym z nich i powiedzieć:

system('sleep', '10') 

następnie szybko przełączyć się na drugi i spojrzeć na ps aukcji. Powinieneś tam zobaczyć sleep 10. Ale, jeśli dasz to irb:

system(['sleep', 'pancakes'], '10') 

i sprawdź ps listę zobaczysz pancakes 10. Podobne dwu-terminalowe triki pokażą Ci shell -c sleep 10, jeśli powiesz system('sleep 10').

Jeśli dostarczyć Hash jako pierwszy argument, to Hash służy jako zmiennych środowiskowych dla zrodził proces. Jeśli podasz Hash jako ostateczny argument, to Hash jest używany jako opcje; dalsza dokumentacja dotycząca argumentów jest zgodna z dokumentacją system, dostępną pod numerem Kernel#spawn.

+0

Dziękuję za twoją długą odpowiedź! Nadal nie jestem do końca pewien, co jest "argumentem"?Czy '-pk',' -nd', '-P','/public/google', 'www.google.com' są liczone jako jeden argument? –

+0

@MikaH .: Tak, każdy z nich jest argumentem. –

Powiązane problemy