PHP调用命名管道命令出现语法错误的问题求助
解决PHP中
system()执行bash进程替换报错的问题 这个问题我之前也碰到过,核心原因其实很简单:PHP的system()函数默认调用的是系统的sh shell,而<()这种进程替换语法是bash专属的扩展特性,像Debian/Ubuntu默认的dash这类sh实现并不支持它,所以才会抛出Syntax error: "(" unexpected的错误。
你直接在终端执行echo <(ls)能成功,是因为当前终端默认用的是bash,自然支持这个语法,但PHP的system()函数走的是系统默认的sh路径,两者的执行环境不一样。
解决方案:显式指定用bash执行命令
只需要把要执行的命令包裹在bash -c '...'里,强制让bash来解析语法,修改后的脚本如下:
<?php system("bash -c 'echo <(ls)'");
执行php a.php后,就能正常输出/dev/fd/63了。
额外补充
- 不光是
system(),用exec()或者shell_exec()时也会碰到同样的问题,解决思路完全一致,都是指定bash作为执行shell。 - 如果你的命令里包含其他复杂的bash特性(比如高级管道、数组操作、自定义shell函数等),都建议显式用
bash -c来调用,避免sh的兼容性限制。
内容的提问来源于stack exchange,提问作者aae334
相关产品推荐
相关产品推荐

