PHP中的Bash:命令行替换:意外令牌附近的语法错误`(''

时间:2012-03-02 02:45:50

标签: php bash shell

我从proftpd日志中提取信息。我必须从PHP脚本中调用这个单行程序,但它不再起作用。

这是原始行,有效:

(gunzip -c xferlog*.gz; cat xferlog?(*)!(.gz)) | grep 'host [0-9]\+ file a _ o r ftpuser' | sort -k 5n,5 -k 2M,2 -k 3n,3 -k 4,4 | tail -1 | cut -c 1-24

这是我在PHP中执行时出现的错误:

$cmd = "(gunzip -c $logFile*.gz; cat $logFile?(*)!(.gz)) | grep '$host [0-9]\+ $file a _ o r $ftpUser' | sort -k 5n,5 -k 2M,2 -k 3n,3 -k 4,4 | tail -1 | cut -c 1-24";
exec($cmd);
sh: Syntax error: "(" unexpected (expecting ")")

我尝试了几种可以由PHP调用的bash脚本,但它没有成功。我有错误:

bash: command substitution: line 9: syntax error near unexpected token `('
bash: command substitution: line 9: `cat ${LOGS}?(*)!(.gz)'

bash: ./extract_date_in_xferlog.sh: line 8: syntax error near unexpected token `('
bash: ./extract_date_in_xferlog.sh: line 8: `(gunzip -c ${LOGS}*.gz; cat ${LOGS}?(*)!(.gz)) | grep "$HOST [0-9]\+ $FILE a _ o r $USER" | sort -k 5n,5 -k 2M,2 -k 3n,3 -k 4,4 | tail -1 | cut -c 1-24'

我有点困惑,谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

奇怪的通配符使用扩展的globbing。您需要启用extglob作为脚本的一部分(可能更好)或在Bash设置中(可能在之前的位置,然后当有人因无关原因进行更改时它会崩溃)。

答案 1 :(得分:0)

您可能无法在脚本中正确转义引号。

我建议将shell命令作为单引号字符串处理,假设您不希望在shell命令中嵌入PHP变量,然后确保命令中的所有单引号都使用\'转义为避免过早地终止PHP字符串。

或者,您可以使用HEREDOCNOWDOC样式字符串来避免转义问题。