生成已安装 PHP 扩展的列表

生成已安装 PHP 扩展的列表

我的目标是编写一个尽可能简单(但不是更简单)的程序,它生成当前安装的 PHP 扩展(*.so 文件)的列表,用户可以简单地将其复制/粘贴到他们的php.ini。它至少应该与 OS X 和至少一些主要的 Linux 发行版(Ubuntu、Arch Linux、RHEL 等)兼容。

预期输出如下:

extension=iconv.so
extension=mcrypt.so
...

到目前为止,我已经想出了这个:

find `php-config --extension-dir` -name "*.so" | rev | cut -d / -f 1 | rev

它工作得很好,但我觉得所有的字符串反转有点笨拙。而且,它只生成扩展名,不添加前缀extension=

我需要使用反转,因为扩展目录可能具有任何深度,因此我不能简单地在预先确定的路径分隔符位置剪切字符串。但是,我知道如果我从第一个分隔符的末尾剪切它,我只会得到文件名。

然后我发现了replace实用程序并编写了这个,这非常适合我的任务,但它似乎不适用于我最常使用的两个系统 OS X 和 Arch Linux:

find `php-config --extension-dir` -name "*.so" | replace `php-config --extension-dir`/ 'extension='

基本上,我正在寻找其他创造性(但简单)的方法来完成这项任务。我还可以使用哪些其他实用程序?教育我吧! :)

答案1

这个怎么样?

find "`php-config --extension-dir`" -name "*.so" | sed 's!^.*/!extension=!'

对于每一行,sed将匹配从开头 ( ^) 开始并以 结束的最长字符串/。它将始终匹配直到最后一个的所有内容/,因为它是贪婪匹配,即它将匹配所有内容文件名。然后将其替换为extension=.

它最终像这样:

$ find "`php-config --extension-dir`" -name "*.so" | sed 's!^.*/!extension=!'
extension=pdo_pgsql.so
extension=pdo_sqlite.so
extension=mysqlnd.so
extension=mysqli.so
extension=enchant.so
extension=pgsql.so
extension=mysql.so
extension=pdo_odbc.so
extension=odbc.so
extension=curl.so
extension=pdo.so
extension=pdo_mysql.so
extension=sqlite3.so

这似乎就是你想要的。

sed应该随处可用,因为它是 POSIX 标准的一部分。

答案2

如果您有GNU find可以使用的-printf选项

find `php-config --extension-dir` -name "*.so" -printf 'extension=%f\n' 

相关内容