0

在一个大型 Makefile 托管项目中,我最近添加了一些 PHP 生成的目标,并且 bash 完成停止工作:按 [tab] 不会触发完成,但会插入一个制表符。

我将问题隔离到这个最小的 Makefile:

# TARGETS = $(echo target1 target2)
TARGETS = $(php -r 'echo "target1 target2";')
# TARGETS = $(python -c 'print "target1 target2"')
# TARGETS = $(ruby -e 'puts "target1 target2"')

$(TARGETS):
    echo $@

如果我使用 bash-echo、python 或 ruby​​ 版本的 TARGETS 宏,bash 补全会按预期工作,但如果我使用 php 版本,bash 补全就变得无用了。

我可以在以下位置重现此问题:

  • Mac OS 10.7.5,默认 /usr/bin/php (5.3.15),默认 /bin/bash (3.2.48(1)-release),bash_completion 1.3_4(与 macports 一起安装)
  • Ubuntu 10.04,默认 /usr/bin/php (5.3.5-1ubuntu4ppa1),默认 /bin/bash (4.1.5(1)-release),默认 bash-completion 1:1.1-3ubuntu2

有人知道出了什么问题以及可以做些什么吗?

4

1 回答 1

1

好的,做了一些更多的研究和谷歌搜索,并在以下位置找到了一个解决方法的解释:

显然 PHP 中的 readline 支持(带有 libedit 的 PHP CLI 编译为 Ubuntu Lucid 上的 readline 支持)以某种方式导致了问题(Paul Serby 未分析),解决方法是显式控制 PHP 进程的标准输入。

例如:

TARGETS = $(php -r 'echo "target1 target2";' < /dev/null )

或者

TARGETS = $(echo '' | php -r 'echo "target1 target2";' )

这两种解决方案都适用于我尝试过的两个平台。

更多参考资料:

于 2013-04-26T14:07:24.957 回答