如何使用系统调用使用Ruby打开图像文件?
从现在开始,我尝试在ruby中打开Ubuntu14.04中的一个图像文件,如下所示,但文件名中的空格是问题所在。如何在不更改文件名的情况下执行此操作?我想写一个脚本来打开多个图像文件,其中都有空格 打开文件.rb如何使用系统调用使用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
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还是有好处的。编辑:哦,我看到你在回答中已经提到了这一点