Аргументы системного метода Ruby

Я совсем запутался, читая документ Руби system метод здесь. Я не уверен, какие команды и какие опции. Что делать, если я хочу выполнить следующее?

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

по соображениям безопасности, я хотел бы использовать одну из версий, которая не использует оболочку (вторая и третья формы в URL-адрес я дал, а не первый)

1 ответов


Рассмотрим пример:

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

первый проходит строку 'echo *' к оболочке для анализа и выполнения; вот почему system('echo *') производит тот же результат, что и saying echo * из командной строки: вы получаете список файлов в текущем каталоге. Соответствующая форма аргумента:

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

второй полностью обходит оболочку. Он будет искать echo на PATH а затем выполните его со строкой '*' в качестве аргумента. Поскольку оболочка расширяет подстановочные знаки (по крайней мере, в системах unixy),* останется как простой * и вы увидите * как выход. Соответствующая форма аргумента здесь:

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

третий вид:

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

используется, когда вы хотите выполнить cmdname но пусть он появится с другим именем в ps списки и тому подобное. Вы можете увидеть это в действии, открыв два терминала. Открой irb в одном из них и скажи:

system('sleep', '10')

затем быстро переключитесь на другой и посмотрите на ps листинг. Вы должны увидеть sleep 10 там. Но, если вы дадите это irb:

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

и проверяем ps список, вы увидите pancakes 10. Похожие two-terminal tricks покажут вам a shell -c sleep 10 если вы говорите system('sleep 10').

если вы задаете Хэш в качестве первого аргумента, то этот хэш используется в качестве переменных среды для порожденного процесса. Если вы поставляете хэш как последний аргумент, то что хэш используется в качестве опций; дальнейшая документация по аргументам, как отмечено в system документация, доступная в разделе Kernel#spawn.