如何列出包提供的命令?

Oli*_*Oli 12 package-management executable

我很好奇某个包为我的系统提供了什么命令。由命令,我的意思是在道可执行,我可以在命令行(运行lsgrepsed,等等)。

不是要从命令中计算出包,这可以通过以下方式完成:

dpkg -S `which command`
Run Code Online (Sandbox Code Playgroud)

我想要相反的,一个包中的命令列表。

Oli*_*Oli 8

下面的小循环将使用已安装的包来处理这个问题。

$ for f in $(dpkg -L login); do [[ $(type -P "${f##*/}") == "$f" ]] && echo ${f##*/}; done
nologin
lastlog
newgrp
faillog
su
login
sg
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • dpkg -L package生成我们迭代的包中所有文件的列表。
  • 我们剥掉一点点bashism目录名:${f##*/}
  • 使用 bash-builtintype -P command我们查看该命令是否在路径中并且它的路径等于我们开始的文件。
  • 我们通过抽出缩短的命令来完成。
  • [[ condition ]] && command 只是 if..then 语句的 bash 简写。

重要的是要注意,并非所有包都包含您希望它们包含的命令。Apache 被拆分成多个包(带有-common-bin子包)并且vlc命令不在vlc包中,它在vlc-nox. 有很多这样的例子。


这可以根据Gilles 的想法进行调整,进行字符串匹配而不是实际检查,但将其全部保存在一个 bash 进程中(并且仍然使用整个路径)。

for f in $(dpkg -L login); do [[ $f =~ ^${PATH//:/|} ]] && echo ${f##*/}; done
Run Code Online (Sandbox Code Playgroud)

这里的主要区别是[[$f =~ ^${PATH//:/|} ]]. 这是一个 in-Bash 正则表达式搜索。该${PATH//:/|}部分正在获取 $PATH 的内容并将它们破解为一个肮脏的小正则表达式。条件应该检查​​字符串以路径的一部分开始。