Ruby 脚本,我想在其中运行 shell 脚本并传入带空格的文件名。我尝试过十几种方法。这是一个:
filename = "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"
filename = filename.gsub(' ', '\ ')
'exiftool -Camera:DriveMode #{filename}'
其他包括对路径进行硬编码
result = %x{exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf}
,这会导致“无法读取8个文件”
和
system 'exiftool -Camera:DriveMode "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"'
无输出。
命令行
➜ exiftool -Camera:DriveMode "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf" Drive Mode : Single Shot; Electronic shutter
带有转义空格的命令行有效
➜ exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf Drive Mode : Single Shot; Electronic shutter
我最终需要的是让这样的事情发挥作用。上面试图找出如何让文件名起作用:
filename = "/Users/gscar/Pictures/_Photo Processing Folders/Watched folder for import to Photos/2024.03.25-16.09.59.gs.O.orf"
gsubfilename = filename.gsub(' ', '\ ')
`"exiftool -Camera:DriveMode #{gsubfilename}"`
结果是:
sh: exiftool -Camera:DriveMode /Users/gscar/Pictures/_Photo\ Processing\ Folders/Watched\ folder\ for\ import\ to\ Photos/2024.03.25-16.09.59.gs.O.orf: No such file or directory
,但是当然在 shell 中运行它可以正常工作。
这里“逃避”我的是什么?谢谢
PS mini_exiftool 似乎无法处理“DriveMode”。
正如评论所建议的,最好的方法是避免使用 shell,并使用数组中的参数调用命令。具体来说,对于
system
,如果除了程序名称之外至少向函数提供一个参数,则不会调用 shell。
system('exiftool', '-Camera:DriveMode', filename)
如果你真的想将参数解析委托给 shell,请使用
Shellwords
:
require 'Shellwords'
system("exiftool -Camera:DriveMode #{filename.shellescape}")