You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用exec类函数执行网卡上传速率命令报错求助

解决PHP执行网卡速率命令时的语法错误问题

这个问题我太熟了!报错的核心原因是:你用的<(...)是Bash专属的进程替换语法,但PHP的system()、exec()、shell_exec()这些函数默认调用的是sh(不是Bash),而sh并不支持这种语法,所以才会抛出Syntax error: "(" unexpected的错误。

下面给你两种靠谱的解决办法:

方法一:强制用Bash执行命令

直接把你的命令包裹在bash -c里,让Bash来解析整个命令(这样就能支持进程替换了)。注意转义要正确,PHP代码可以这么写:

<?php
// 用双引号包裹外层,内部转义更清晰
$command = "bash -c 'awk \'{if(l1){print ($10-l2)/1024/1024} else{l1=$2; l2=$10;}}\' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)'";
$result = shell_exec($command);
echo "eth0上传速率:" . $result . " MB/s";
?>

方法二:改写命令,去掉Bash专属语法

如果不想依赖Bash,也可以把命令改成sh兼容的写法,用管道+连续命令来替代进程替换:

<?php
$command = '(grep eth0 /proc/net/dev && sleep 1 && grep eth0 /proc/net/dev) | awk \'{if(l1){print ($10-l2)/1024/1024} else{l1=$2; l2=$10;}}\'';
$result = shell_exec($command);
echo "eth0上传速率:" . $result . " MB/s";
?>

这个写法的逻辑是先获取一次网卡数据,等待1秒后再获取一次,把两次结果通过管道传给awk处理,完全不需要进程替换,sh也能正常执行。

两种方法都可以解决问题,你可以根据自己的环境选择。如果执行后还是有问题,可以用var_dump($result)看看具体的输出或错误信息。

内容的提问来源于stack exchange,提问作者New Dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:10