正如问题所述...... 当我做的时候
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”。任何帮助,将不胜感激。
答案 0 :(得分:2)
在您的登录shell中,ls
可能是别名,因此它会打印另一个日期。这将在你的.basrc或.bash_profile中。
将--time-style=
选项显式传递给ls
,以确保在使用PHP时以预期格式打印日期。
答案 1 :(得分:1)
这不是一个额外的输出,这是格式化日期的差异。显然,你在PHP和bash(“命令提示符”)中设置了不同的语言环境。
(在bash中,运行export LANG=C
或export LANG=en_US
会给出三个字母的月份名称结果)
答案 2 :(得分:1)
我猜你只对文件名感兴趣,而且你想用反向时间排序。 试试这个:
ls -tr1> output.txt 2>& 1
您将获得仅包含文件名的列表,因此您根本不需要awk。
另一种解决方案是使用“--time-style iso”指定时间格式。看看man page
答案 3 :(得分:0)
ls
的输出严重依赖于环境(例如,LANG
是这里的重要变量)。为什么不组合使用scandir
,stat
和krsort
?
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专家,所以上面的代码段可能非常不安全且充满错误。