2010-01-25 3 views
1

Как я могу получить вывод о том, что unix 'ls' (Desktop, Pictures, Music myysong.mp3 и т. Д.) Преобразуется в строку?Рубиновая система ('ls') на строку?

+1

Лучше не прибегать к снарядам, если вы можете помочь! Любая причина, почему не 'Dir.entries' или' foreach'? – bobince

ответ

5

Обратный ход выполняет системную команду и возвращает ее как строку.

result = `ls ~/Downloads` 

puts result.reverse 
puts result.split('/') 
+0

+1 Это мило. Узнавайте что-то новое каждый день. :) Я использовал систему все время, не зная, что вывод был возвращен как строка. – Beanish

+0

Каждый метод Ruby возвращает что-то. Конечно, иногда это что-то «ноль», но чаще всего это возвращение именно так, как вы ожидаете. Просто запустите 'irb' и попробуйте. Если он печатает выходные данные, он возвращает что-то. –

6

Вы имеете в виду захват вывода команды 'ls'? Вы можете использовать `` в Ruby. Например:

mystring = `ls <dir>` 
print mystring.strip(); 

Итак, я думал, что отредактировал свой предыдущий ответ. Если вам посчастливилось встретить ошибку в команде ls (скажем, что путь не существует, например) или какая-либо другая системная команда, вывод будет отображаться в STDERR, заставляя его отображать на экране, нравится ли вам это или нет, которые обратные линии не будут захватывать (они получат только STDOUT). Чтобы обойти это, просто добавьте 2> & 1 до конца вашей команды. Например:

#!/usr/bin/ruby -w 

mystring = `ls /path/does/not/exist 2>&1`; 
# above will not display anything to screen but will hold error message in mystring 
print mystring; 
# outputs: ls: cannot access /path/does/not/exist: No such file or directory 

Надеюсь, это поможет.

+0

Так формально использовать полуколоны! – tadman

+1

Это привычка, к сожалению, я еще не смог ударить; – user198470

+0

Я люблю точки с запятой. – JAL

2

Если есть использовать Ls, и с помощью пользовательского ввода, вам нужно быть параноиком:

d = IO.popen("-"){|f| if f then break f.read else system('ls', user_input) end } 

Это кажется самым безопасным способом сделать это, потому что он прошел user_input Л.С. напрямую как ARGV [1], а не отправлять всю строку в оболочку.

С ``, пользовательский ввод /; rm -Rf ~ приведет к печальным лицам. При использовании метода (ужасно длинный) выше это приведет к ошибке.

+0

Пара или цитата вашего первоначального отступа в последнем предложении, чтобы исправить подсветку синтаксиса для вашего комментария. –