Bash в PHP: Подстановка командной строки: синтаксическая ошибка рядом с неожиданным токеном `(' - PullRequest
0 голосов
/ 02 марта 2012

Я извлекаю информацию из журналов 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 ")")

Я пробовал несколько сценариев bash, которые будут вызываться PHP, но они не увенчались успехом. У меня были ошибки вроде:

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 ]

1 голос
/ 02 марта 2012

Странный подстановочный знак использует расширенную глобализацию.Вам нужно включить extglob как часть вашего скрипта (возможно, лучше) или в настройках Bash (возможно, там, где он был раньше, а затем он сломался, когда кто-то изменил его по несвязанным причинам).

0 голосов
/ 02 марта 2012

Возможно, вы не правильно экранировали кавычки в скрипте.

Я предлагаю обрабатывать команду оболочки как строку в одинарных кавычках, предполагая, что вы не хотите вставлять переменные PHP в команду оболочки, а затем удостовериться, что все одинарные кавычки в команде экранированы с помощью \', чтобы избежать преждевременного Завершение строки PHP.

В качестве альтернативы вы можете использовать строку стиля HEREDOC или NOWDOC , чтобы избежать экранирования.

...