2010-01-25 22 views
1

我怎么能说unix'ls'(桌面,图片,音乐myysong.mp3等)的输出转换为字符串?Ruby系统('ls')来串?

+1

最好不要诉诸壳,如果你能帮助它!任何不为'Dir.entries'或'foreach'的理由? – bobince 2010-01-25 19:01:49

回答

5

反引号执行系统命令并将其作为字符串返回。

result = `ls ~/Downloads` 

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

+1这很甜。每天学些新东西。 :)我一直使用系统而不知道输出作为字符串返回。 – Beanish 2010-01-25 18:16:49

+0

Ruby中的每个方法都会返回一些东西。当然,有时候某些东西是“无”的,但更多的时候,回报就是你所期望的。只需启动'irb'并尝试。如果它打印输出,那么它返回了一些东西。 – 2010-01-25 18:33:26

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 2010-01-25 18:40:48

+1

这是一种习惯,我还没有能够踢,但不幸的是; – user198470 2010-01-25 18:53:01

+0

我喜欢分号。 – JAL 2010-01-25 20:18:46

2

如果使用ls和使用用户的输入,你需要偏执:

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

这似乎是做最安全的方式,因为它直接传递USER_INPUT到LS作为ARGV [1],而不是将整个字符串发送到shell。

用``,/; rm -Rf ~的用户输入会导致悲伤的面孔。上面的(可怕的长)方法只会导致错误。

+0

在最后一句中对或引用您的初始反引号以修复语法突出显示以供评论。 – 2010-01-25 21:22:39