通过exec()使用ls命令输出结果发生变化

3
我正在使用PHP中的exec()命令来执行ls命令,但是与在shell中运行相比,我得到了不同的输出。通过PHP运行ls命令时,日期的年份和月份会被更改为月份名称。
在shell中运行该命令:
$ ls -lh /path/to/file
 -rw-r--r-- 1 sysadmin sysadmin 36M 2011-05-18 13:25 file

通过PHP运行命令:

<?php
exec("ls -lh /path/to/file", $output);
print_r($output);

/*
Array
(
    [0] => -rw-r--r-- 1 sysadmin sysadmin  36M May 18 13:25 file
)
*/

请注意: - 当我通过cli运行PHP脚本时,问题不会出现(只有在通过apache运行时才会出现)。 - 我检查了页面的源代码,以确保我看到的是我得到的内容(我确实得到了月份名称而不是正确的日期)。 - 我还以www-data用户身份通过shell运行ls命令,以查看ls是否根据用户提供不同的输出(从shell中始终获得相同的输出,即我获得的是yyyy-mm-dd格式的日期而不是月份名称)。
更新答案: alias给了我这个结果:
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

从这些别名中,我无法找到直接负责时间显示的开关:

-C  list entries by columns
-F  append indicator (one of */=>@|) to entries
-A  do not list implied . and ..
-a  do not ignore entries starting with .
-l  use a long listing format

然而,在PHP中使用--time-style=long-iso确实解决了这个问题。

在 shell 中输入“alias”。也许你在那里有一个 ls 的别名。 - Leif
可能是重复的内容:使用PHP exec()执行ls -ltr命令 - Lightness Races in Orbit
2个回答

4

ls 命令行有几个选项用于日期显示格式。请检查您的命令行版本是否被别名包含了一些东西,比如 ls --time-style=locale。PHP exec 版本很可能没有这种别名设置,并且使用默认的 ls 设置。


0

ls 命令的输出结果取决于当前的语言环境设置。当你在控制台上运行该命令时,它会使用你的语言环境设置,但用户 www-data 则有自己的语言环境设置(可能与你的不同)。因此,我建议你明确指定语言环境设置:

exec("LC_TIME=POSIX ls -lh /", $output);

在这里,您可以用您想要使用的语言环境来代替POSIX


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接