ls -ltr使用PHP exec()

时间:2010-07-01 10:56:15

标签: php exec

正如问题所述...... 当我做的时候

exec("ls -ltr  > output.txt 2>&1",$result,$status);

它与正常输出不同。添加了一个额外的列。

之类的东西
-rw-r--r-- 1 apache   apache    211 Jul  1 15:52 withoutsudo.txt
-rw-r--r-- 1 apache   apache      0 Jul  1 15:53 withsudo.txt

从命令提示符执行时的类似

-rw-r--r-- 1 apache   apache    211 2010-07-01 15:52 withoutsudo.txt
-rw-r--r-- 1 apache   apache    274 2010-07-01 15:53 withsudo.txt
-rw-r--r-- 1 apache   apache    346 2010-07-01 15:55 sudominusu.txt
-rw-r--r-- 1 apache   apache    414 2010-07-01 15:58 sudominusu.txt

看到差异。所以在第一个输出中,我通常的awk'{print $ 8}'失败了。 我面临与cron相同的问题。但是通过调用

来解决它
./$HOME/.bashrc
脚本中的

。但没有发生使用PHP。如果不知何故,我可以从通常的环境“告诉”php到“exec”。任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:2)

在您的登录shell中,ls可能是别名,因此它会打印另一个日期。这将在你的.basrc或.bash_profile中。

--time-style=选项显式传递给ls,以确保在使用PHP时以预期格式打印日期。

答案 1 :(得分:1)

这不是一个额外的输出,这是格式化日期的差异。显然,你在PHP和bash(“命令提示符”)中设置了不同的语言环境。

(在bash中,运行export LANG=Cexport LANG=en_US会给出三个字母的月份名称结果)

答案 2 :(得分:1)

我猜你只对文件名感兴趣,而且你想用反向时间排序。 试试这个:

ls -tr1> output.txt 2>& 1

您将获得仅包含文件名的列表,因此您根本不需要awk。

另一种解决方案是使用“--time-style iso”指定时间格式。看看man page

答案 3 :(得分:0)

ls的输出严重依赖于环境(例如,LANG是这里的重要变量)。为什么不组合使用scandirstatkrsort

function ls($dir_name) {
  $finfo = array();
  foreach (scandir($dir_name) as $file_name) {
    $s = stat(join('/', array($dir_name,$file_name)));
    $finfo[$file_name] = $s['mtime'];
  }
  krsort($finfo);
  return array_keys($finfo);
}

这比炮轰ls更安全,效率更高。更不用说您可以获得定制排序的好处,并以exec内难以实现的方式过滤结果。

BTW:我绝不是PHP专家,所以上面的代码段可能非常不安全且充满错误。