如何使用系统调用用Ruby打开图像文件?

时间:2016-01-04 03:22:07

标签: ruby

list of regex patterns我尝试在ruby中打开Ubuntu 14.04中的图像文件,如下所示,但文件名中的空格是个问题。如何在不更改文件名的情况下执行此操作?我想写一个脚本来打开多个图像文件,里面都有空格。

open_file.rb

name_of_image_file = Shellwords.shellescape(name_of_image_file) 
name_of_image_file = "~/folder1/usa american_flag.jpg" 
system("gnome-open #{name_of_image_file}")

2 个答案:

答案 0 :(得分:1)

您的问题是您的name_of_image_file中有要求shell解释的内容('~')以及name_of_image_file中您不想要的其他内容shell解释(' ')。

通常情况下,shell会扩展全局字符,例如*?,最重要的是你~Shellwords.shellescape了解所有这三个,因此它将逃脱~

> name_of_image_file = "~/folder1/usa american_flag.jpg" 
 => "~/folder1/usa american_flag.jpg" 
> puts Shellwords.shellescape(name_of_image_file)
\~/folder1/usa\ american_flag.jpg

据推测,您希望shell将~展开到您的主目录,但由于~已转义,因此不会发生,而gnome-open将会查找名为当前目录中的~/folder1/usa american_flag.jpg

解决问题的方法有两个:

  1. 使用File.expand_path
  2. 自行展开~
  3. 使用多参数版本的system
  4. 完全绕过shell

    这样的事情:

    name_of_image_file = "~/folder1/usa american_flag.jpg"
    system('gnome-open', File.expand_path(name_of_image_file))
    

    system的那种形式不会调用shell,因此如果文件名中有空格(或引号)则无关紧要。 File.expand_path会为您扩展领先的代号,因此您不需要shell来执行此操作。

    我甚至建议你忘记system(command_string) system版本的system(command, arg1, arg2, ...)存在,你几乎总是更好地绕过shell(以及所有版本)它的引用和转义问题)并使用system形式的SELECT u.first_name, u.last_name, s.magazine_id, ps.id FROM users u JOIN subscriptions s ON u.id = s.user_id LEFT JOIN premium_subscriptions ps ON s.user_id = ps.user_id AND s.magazine_id = ps.magazine_id 。 对于反引号也是如此,如果你需要获得命令的输出,你最好使用Open3

答案 1 :(得分:-1)

在他的名字周围加上引号,使用反斜杠来逃避引用

system("gnome-open \"#{name_of_image_file}\"")