2012-04-30 4 views
3

У меня есть очень простой вопрос. Я запускаю скрипт Ruby для доступа к содержимому каталога в Linux. Каталог запускается через командную строку при выполнении рубинового скрипта.Выполнение команд сценария оболочки в скрипте Ruby

Вопрос в том, как использовать аргумент командной строки в команде для ruby?

Я его установить, как, например:

usrDirectory = ARGV[0] 
lsCmd = `ls -l` 

мне нужно использовать что-то вроде Ls -l usrDirectory. Могу я просто вставить его в команду, как есть?

ответ

2

выше прав, и если вы хотите иметь ls выход на стандартный вывод, это делает его немного чище:

system("ls", "-l", dir) 

Это приведет к тому, что Ruby выведет выход на ваш стандарт вместо того, чтобы помещать вывод в переменную, как указано выше.

+3

Если вы собираетесь использовать 'system', вы должны использовать версию с несколькими аргументами:' system ('ls', '-l', dir) ' –

+0

О да. Я изменю это. Спасибо за напоминание. – Linuxios

0

Вы можете использовать расширение экспрессии и экранирующие последовательности в командной строке:

lsCmd = `ls -l #{usrDirectory}` 
0

У вас есть два варианта. Вы можете сделать:

lsCmd = `ls -l #{usrDirectory}` 

или

command = "ls -l " + usrDirectory 
lsCmd = %x[ #{command} ] 
1

Вы должны быть в состоянии получить то, что вы хотите, не используя оболочку, например:

usr_dir = "/tmp" 
files = Dir["#{usr_dir}/*"] 

p files 

Независимо от того, что вы делаете, будь Очень осторожно при передаче текста, введенного пользователем в оболочку, как часть чего-то, что будет разобрано и выполнено. Например, что произойдет, если пользователь вводит (вместо имени каталога)

; гт -rf/*

?

+1

Вот почему вы используете версии с несколькими аргументами этих команд, они обходят оболочку и используют ваши аргументы напрямую в качестве аргументов для программы. – Linuxios

+0

Да, точка не позволяет оболочке разобрать ее. Путь слишком большой мощности. – theglauber

+0

Точно. Я уверен, что мы согласны. – Linuxios