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

如何使用系统调用使用Ruby打开图像文件?,ruby,Ruby,从现在开始,我尝试在ruby中打开Ubuntu14.04中的一个图像文件,如下所示,但文件名中的空格是问题所在。如何在不更改文件名的情况下执行此操作?我想写一个脚本来打开多个图像文件,其中都有空格 打开文件.rb name_of_image_file = Shellwords.shellescape(name_of_image_file) name_of_image_file = "~/folder1/usa american_flag.jpg" system("gnome-open #{n

从现在开始,我尝试在ruby中打开Ubuntu14.04中的一个图像文件,如下所示,但文件名中的空格是问题所在。如何在不更改文件名的情况下执行此操作?我想写一个脚本来打开多个图像文件,其中都有空格

打开文件.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}")

在he名称周围加引号,使用反斜杠转义引号

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

您的问题是您的
name\u of\u image\u文件中有您希望shell解释的内容(
'~'
),而
name\u of\u image\u文件中有您不希望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
的文件

您的问题有两个解决方案:

  • 使用展开自己的
    ~
  • 使用的多参数版本完全绕过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\u string)
    版本的
    system
    ,绕过shell(及其所有引用和转义问题)并使用
    system(command,arg1,arg2,…)
    形式的
    system
    几乎总是更好。
    反勾号也是一样,如果需要获取命令的输出,最好使用。

    谁将
    ~
    扩展到当前用户的主目录?如果文件名中有引号,则此操作将失败。我认为您想反转代码的两行,我假设这是一个输入错误。正如Jordon指出的那样,如果文件名中有双引号,这将不起作用。
    Shellwords.escape在这里是正确的,但是当您为图像文件的
    name\u
    指定一个不同的值时,就会抛出结果。为什么?@Jordan:我不认为
    Shellwords
    是这个工作的正确工具,因为它将避开
    ~
    ,并防止shell将其扩展到用户的主目录。最好完全避免shell。虽然可以首先使用
    File.expand\u path
    来避免该问题,但@muistooshort还是有好处的。编辑:哦,我看到你在回答中已经提到了这一点