从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}")
答案 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
。
解决问题的方法有两个:
File.expand_path
~
system
。这样的事情:
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}\"")