为什么ruby的`system`不是`shellescape`的第一个参数?

时间:2017-11-26 22:12:02

标签: ruby escaping system

在shell中引用时,目录名称带括号,如:

/tmp/(example)

需要像以下一样进行转义:

/tmp/\(example\)

当我在ruby的system调用中引用它们时,我必须逃避它们,或者不依赖于它们是否是第一个参数。

  • 非转义目录作为第一个参数。故障。

    system('/tmp/(example)/script')
    #>> sh: -c: line 0: syntax error near unexpected token `example'
    #>> sh: -c: line 0: `/tmp/(example)/script'
    #=> false
    
  • 将转义目录作为第一个参数。成功。

    system('/tmp/(example)/script'.shellescape)
    #=> true
    
  • 非转义目录作为第二个参数。成功。

    system('touch', '/tmp/(example)/script')
    #=> true
    
  • 将转义目录作为第二个参数。故障。

    system('touch', '/tmp/(example)/script'.shellescape)
    #>> touch: /tmp/\(example\)/script: No such file or directory
    #=> false
    

似乎system转义了每个参数的名称,但命令(第一个参数)。这是脚本中的问题,其命令具有相对路径,例如:

system("#{__dir__}/something")
  1. 为什么system会这样做?
  2. 是否有本地选项让它逃脱一切?

0 个答案:

没有答案