apt-get 安装匹配通配符的软件包

xrf*_*ang 6 regex apt

我正在运行 Debian 8 Jessie,尝试从 shell 脚本安装 PHP 命令行解释器。

这是我所做的:

sudo apt-get install php-cli
Run Code Online (Sandbox Code Playgroud)

它告诉我没有php-cli。我确实发现有php5-cli。但是,为了使我的脚本更加健壮,例如在最近的 ubuntu 服务器产品上运行时php7,我不想指定php5-cli.

我用谷歌搜索答案,但我得到的只是让我困惑:

xrfang@P-qapub:~$ sudo apt-get install --names-only "php*-cli"
E: Command line option --names-only is not understood
xrfang@P-qapub:~$ sudo apt-cache search --names-only php-cli
php-google-api-php-client - Google APIs client library for PHP
xrfang@P-qapub:~$ apt-cache search --names-only "php\d+-cli$"
xrfang@P-qapub:~$ apt-cache search --names-only "php\d-cli$"
xrfang@P-qapub:~$ apt-cache search --names-only "php\\d-cli$"
xrfang@P-qapub:~$ apt-cache search --names-only "php5-cli$"
php5-cli - command-line interpreter for the php5 scripting language
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我不想要适用于 PHP 的 Google API,因此我尝试使用正则表达式,但如上所示,它不接受\d.

  2. 是否可以以某种方式使用 --name-only apt-get install,而不是apt-cache search.

谢谢!

A.B*_*A.B 5

是否可以以某种方式使用 --name-only apt-get install,而不是apt-cache search.

默认情况下,apt-cache search从可用的包名称及其详细描述中搜索信息。--names-only将此搜索仅限于包名称。

现在apt-get不关心描述。它将逐字尝试包名称,如果没有找到,则会将该参数视为正则表达式(虽然没有真正记录,实际上是扩展的正则表达式)。此正则表达式将仅用于匹配已知包列表中的包名称。因此没有--names-only可用的选项:考虑apt-get此选项的永久效果。

我不想要适用于 PHP 的 Google API,因此我尝试使用正则表达式,但如上所示,它不接受\d.

apt-get接受(扩展)正则表达式,而不是Perl 兼容正则表达式\d表示仅在 PCRE 中的数字,在 BRE 或 ERE 中没有特殊含义。正则表达式中的数字可以表示为[0-9](或作为[[:digit:]]扩展正则表达式语法)。

您的搜索将是:

$ apt-cache search --names-only 'php[0-9]+-cli'
php5-cli - command-line interpreter for the php5 scripting language
Run Code Online (Sandbox Code Playgroud)

要安装任何 php cli 编号版本,如下所示:

# apt-get install '^php[0-9]+-cli$'
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'php4-cli' for regex '^php[0-9]+-cli$'
Note, selecting 'php5-cli' for regex '^php[0-9]+-cli$'
The following extra packages will be installed:
Run Code Online (Sandbox Code Playgroud)

[...]

这将安装php5-cli及其依赖项。

请注意使用^$来分隔所选包名称的开头和结尾:一旦表达式用作正则表达式,它就可以是包名称的任何部分,因此最好小心。例如,尝试apt-get install .将尝试安装任何至少具有一个字符的软件包:所有这些软件包,当然会因冲突而失败。

对于小细节:php4-cliJessie 中不存在,但被其他包 ( php-xajax) 引用,这就是它被选为候选包的原因,因为它与正则表达式匹配。当然它是不可安装的,所以最后就不列出来了。