2010-01-25 24 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