Выходные данные ls изменяются при использовании через exec () - PullRequest
3 голосов
/ 24 июня 2011

Я использую команду ls через PHP и exec(), и я получаю другой вывод, чем когда я запускаю ту же команду через оболочку. При запуске ls через PHP год и месяц даты заменяются на имя месяца:

Запуск команды через оболочку:

$ 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
)
*/

Обратите внимание:
-проблема не возникает, когда я запускаю скрипт PHP через cli (это происходит только при запуске через apache)
-Я проверил исходный код страницы, чтобы убедиться, что то, что я видел, было тем, что я получал (и я получаю название месяца вместо правильной даты)
-Я также запускаю команду ls через оболочку от имени пользователя www-data, чтобы увидеть, выдавал ли ls различный вывод в зависимости от пользователя (вывод всегда одинаков из оболочки, то есть я получаю дату в гггг-мм-дд вместо названия месяца)

Обновление с ответом

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

Однако использование --time-style=long-iso в PHP решило проблему.

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

ls имеет несколько параметров командной строки для формата отображения даты.убедитесь, что ваша версия командной строки не содержит псевдонимов типа ls --time-style=locale.Версия PHP exec'd, скорее всего, не будет содержать этот псевдоним и использует настройки по умолчанию ls.

0 голосов
/ 24 июня 2011

ls вывод зависит от текущих настроек локали.Когда вы запускаете его из консоли от своего имени, он использует ваши настройки локали, но пользователь www-data имеет собственные настройки локали (которые, вероятно, отличаются от ваших).Итак, я предлагаю вам явно указать настройки локали:

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

, где вместо POSIX вы можете заменить локаль, которую хотите использовать.

...