我有一个半冗长的shell命令,我需要在php中执行。我觉得我已经将所有内容都正确转义,但是从php的exec()函数执行时它无法正常工作。当我使用exec()运行命令时,它会退出而不会出错,但是无法正常运行。
我正在将包含电子邮件地址的列表文件与其他管道分隔信息与包含md5版本电子邮件地址的文本文件进行比较,以禁止显示原始列表。
这是bash命令:
while read line ; do email=`echo "$line" | cut -d '|' -f1` ; if [ $(E=`echo -en "$email" | md5sum | awk '{print $1}'`; grep $E /path/to/suppressions | head -1 ;) ] ; then continue ; else echo $line ; fi done < /path/to/emails
/ path / to / suppressions是一个文本文件,包含要禁止的电子邮件地址的md5版本(它包含“emailtosuppress@domain.com”的md5:
edb5feb3be7d0a4e1e250ccdf0c04ace
/ path / to / emails是一个文本文件,其中包含一些电子邮件地址列表以及其他一些已删除的信息:
emailtokeep@domain.com|1000|1
emailtosuppress@domain.com|1000|1
当命令在bash中执行时,输出只是抑制列表中不存在的电子邮件地址,并且它完美无瑕:
emailtokeep@domain.com|1000|1
我遇到的麻烦是当我在php中使用exec()执行相同的命令时,它会输出“emails”文件中的所有行,而不会抑制抑制文件中的任何匹配。
$supCommand = 'while read line ; do email=`echo "$line" | cut -d \'|\' -f1` ; if [ $(E=`echo -en "$email" | md5sum | awk \'{print $1}\'`; grep $E /path/to/suppressions | head -1 ;) ] ; then continue ; else echo $line ; fi done < /path/to/emails' ;
exec($supCommand, $supStatus) ;
print_r($supStatus) ;
我将命令括在单引号中,并在命令中转义了单引号的四个实例。如果有人有任何想法,我会非常感激。
提前致谢:)
答案 0 :(得分:0)
这似乎有效:
<?php
$bash = '
mapfile -t md5sums < suppressions
function md5 { printf "%s" "$1" | md5sum | cut -f1 -d" "; }
while IFS="|" read -r email b c; do
this_md5=$(md5 "$email")
for suppress in "${md5sums[@]}"; do
[[ $this_md5 == $suppress ]] && continue 2
done
echo "$email|$b|$c"
done < emails
';
$cmd = "bash -c '$bash'";
$keep = passthru($cmd);
print($keep);
?>