![生成已安装 PHP 扩展的列表](https://linux22.com/image/65434/%E7%94%9F%E6%88%90%E5%B7%B2%E5%AE%89%E8%A3%85%20PHP%20%E6%89%A9%E5%B1%95%E7%9A%84%E5%88%97%E8%A1%A8.png)
我的目标是编写一个尽可能简单(但不是更简单)的程序,它生成当前安装的 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'