如何在Ruby中使用shell内置类型命令?

时间:2019-07-28 19:52:26

标签: ruby shell popen

我正在尝试创建一个应用程序,该应用程序在具有dpkg软件包管理器的基于Debian的系统,具有pacman软件包管理器的基于Arch的系统和具有yum软件包管理器或rpm软件包管理器的基于Redhat的系统上会有不同的结果。

要检测系统,我主要在这里使用Kernel#system方法。

尽管如此,该方法仍然有效:

%x(which pacman)        # => "/usr/bin/pacman\n"
%x(which dpkg)          # => ""
system('which pacman')  # => true
system('which dpkg')    # => false

但是我不喜欢使用which,因为它不是内置的。也就是说,您的包裹管理者可以删除whichpacman -R which),否则您可能会错过其中的一个。

在这种情况下,我很想使用type -p

在BASH或sh中:

$ type -p pacman
/usr/bin/pacman
$ echo $?
0

$ type -p dpkg
$ echo $?
1

但是在Ruby中:

> system('type -p pacman')
# => nil

> system('type -p dpkg')
# => nil

> %x('type -p pacman')
sh: type -p pacman: command not found
# => ""

# OR
> require 'open3'
# => true

> Open3.capture2e('type -p pacman')
Traceback (most recent call last):
        7: from /home/sourav/.irb:350:in `<main>'
        6: from (irb):7
        5: from (irb):7:in `rescue in irb_binding'
        4: from /usr/lib/ruby/2.6.0/open3.rb:390:in `capture2e'
        3: from /usr/lib/ruby/2.6.0/open3.rb:208:in `popen2e'
        2: from /usr/lib/ruby/2.6.0/open3.rb:213:in `popen_run'
        1: from /usr/lib/ruby/2.6.0/open3.rb:213:in `spawn'
Errno::ENOENT (No such file or directory - type)

> IO.popen('type -p pacman')
Traceback (most recent call last):
        4: from /home/sourav/.irb:350:in `<main>'
        3: from (irb):6
        2: from (irb):6:in `rescue in irb_binding'
        1: from (irb):6:in `popen'
Errno::ENOENT (No such file or directory - type)

PTY#spawnexecKernel#``

如何在Ruby中使用type -p命令?

1 个答案:

答案 0 :(得分:1)

首先生成一个新的shell,尝试运行命令:

system('sh -c "type -p pry"')
/Users/foo/.rvm/gems/ruby-2.6.3/bin/pry
=> true

同样在找不到false时得到它:

system('sh -c "type -p qwertyasdf"')
=> false