我正在尝试创建一个应用程序,该应用程序在具有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
,因为它不是内置的。也就是说,您的包裹管理者可以删除which
(pacman -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#spawn
,exec
,Kernel#
``
如何在Ruby中使用type -p
命令?
答案 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