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
.
Można użyć wycofań. – alex
'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
Przepraszam, zredagowałem, aby wyjaśnić, o co mi chodzi. –