【发布时间】:2019-01-04 20:53:28
【问题描述】:
我有一个 PHP 脚本,它执行一个 shell 命令来查找给定的两个文件之间的共同项目。这是我的 PHP 脚本的开始:
$E7Bonded_File = "/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Bonded_cust_stats.csv";
$E7Single_File = "/opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Single_cust_stats.csv";
$E7Common_File = "/opt/IBM/custom/NAC_Dslam/junk/Common_tn_SingleBonded_E7_cust_stats.csv";
//only do this once, with old single/bonded filenames. This will be a list to add to the existing Common file.
exec ("comm -12 <(cut -d ',' -f2 $E7Single_File| sort) <(cut -d ',' -f2 $E7Bonded_File| sort)", $outputCommon);
我在运行脚本时看到此错误消息:
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `comm -12 <(cut -d ',' -f2 /opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Single_cust_stats.csv| sort) <(cut -d ',' -f2 /opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Bonded_cust_stats.csv| sort)'
我检查了,括号对于我的exec() 行看起来没问题。
当我在命令行运行 shell 命令时,它会返回我期望的数字列表:
comm -12 <(cut -d ',' -f2 junk/PortParameter_E7_Single_cust_stats.csv| sort) <(cut -d ',' -f2 junk/PortParameter_E7_Bonded_cust_stats.csv| sort)
我上网查了一下,我似乎正确地使用了exec()。我希望将返回的数字存储为数组$outputCommon。
对这个错误信息有什么想法吗?
*********更新答案***************
我的解决方案最终是 mario 和 miken32/我的同事的组合
- 在我的 php 脚本顶部添加
#!/bin/bash,然后 -
添加
/bin/bash -c如下:exec("/bin/bash -c /opt/IBM/custom/NAC_Dslam/Common_list.sh", $outputShell);
将 comm 部分移至 shell 脚本后:
Common_list.sh:
#!/bin/bash
comm -12 <(cut -d ',' -f2 /opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Single_cust_stats.csv| sort) <(cut -d ',' -f2 /opt/IBM/custom/NAC_Dslam/junk/PortParameter_E7_Bonded_cust_stats.csv| sort)
【问题讨论】:
-
您使用哪个shell进行测试,哪个链接为
/bin/sh? dash 不支持表达式管道 AFAIK。 -
我在命令行中执行了“which sh”,它返回了 /bin/sh。我将此行添加到我的脚本中, exec("which sh",$throwaway); var_dump($throwaway);它也返回了 /bin/sh 。我之前在 php exec 中执行的命令中使用了管道。
-
问题是否特定于
comm?还是Linux?还要检查“shell”标签的描述。也就是说,您的问题是题外话,因为它确实缺少minimal reproducible example。