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


Bash in PHP: Command line substitution: syntax error near unexpected token `('

我正在从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'

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

奇怪的通配符使用扩展的globbing。您需要将extglob作为脚本的一部分(可能更好)或在Bash设置中启用(可能是以前的位置,然后当有人出于无关原因更改它时,它就坏了)。

您可能没有正确转义脚本中的引号。

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

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