Как получить домашнюю директорию с PHP-скрипт командной строки?


из командной строки, я могу получить домашний каталог такой:

~/

Как я могу получить домашний каталог внутри моего скрипта php CLI?

#!/usr/bin/php
<?php
echo realpath(~/);
?>
10 51
php

10 ответов:

использовать $_SERVER['HOME']


Edit:

чтобы сделать его полным, посмотрим, что print_r($_SERVER)дал мне, выполнил из командной строки:

Array
(
    [TERM_PROGRAM] => Apple_Terminal
    [TERM] => xterm-color
    [SHELL] => /bin/bash
    [TMPDIR] => /var/folders/Lb/LbowO2ALEX4JTK2MXxLGd++++TI/-Tmp-/
    [TERM_PROGRAM_VERSION] => 272
    [USER] => felix
    [COMMAND_MODE] => unix2003
    [__CF_USER_TEXT_ENCODING] => 0x1F5:0:0
    [PATH] =>/Library/Frameworks/Python.framework/Versions/Current/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
    [PWD] => /Users/felix/Desktop
    [LANG] => de_DE.UTF-8
    [SHLVL] => 1
    [HOME] => /Users/felix
    [LOGNAME] => felix
    [DISPLAY] => /tmp/launch-XIM6c8/:0
    [_] => ./test_php2
    [OLDPWD] => /Users/felix
    [PHP_SELF] => ./test_php2
    [SCRIPT_NAME] => ./test_php2
    [SCRIPT_FILENAME] => ./test_php2
    [PATH_TRANSLATED] => ./test_php2
    [DOCUMENT_ROOT] => 
    [REQUEST_TIME] => 1260658268
    [argv] => Array
      (
        [0] => ./test_php2
      )

    [argc] => 1
    )

Я надеюсь, что я не раскрываю соответствующую информацию о безопасности;)

Совместимость С Windows

отметим, что $_SERVER['HOME'] недоступно в Windows. Вместо этого переменная разбивается на $_SERVER['HOMEDRIVE'] и $_SERVER['HOMEPATH'].

вы можете получить значение $HOME из среды:

<?php
    $home = getenv("HOME");
?>

эта функция берется из Drush project.

/**
 * Return the user's home directory.
 */
function drush_server_home() {
  // Cannot use $_SERVER superglobal since that's empty during UnitUnishTestCase
  // getenv('HOME') isn't set on Windows and generates a Notice.
  $home = getenv('HOME');
  if (!empty($home)) {
    // home should never end with a trailing slash.
    $home = rtrim($home, '/');
  }
  elseif (!empty($_SERVER['HOMEDRIVE']) && !empty($_SERVER['HOMEPATH'])) {
    // home on windows
    $home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH'];
    // If HOMEPATH is a root directory the path can end with a slash. Make sure
    // that doesn't happen.
    $home = rtrim($home, '\/');
  }
  return empty($home) ? NULL : $home;
}

PHP позволяет получить домашний каталог любого из пользователей ОС. Есть 2 способа.

Способ #1:

прежде всего, вы должны выяснить идентификатор пользователя ОС и хранить его где-то ( база данных или файл конфигурации, например).

// Obviously this gotta be ran by the user which the home dir 
// folder is needed.
$uid = posix_getuid();

этот бит кода может быть запущен любым пользователем ОС, даже обычным веб-сервером www-data user, если вы передаете правильный идентификатор целевого пользователя ранее собранный.

$shell_user = posix_getpwuid($uid);
print_r($shell_user);

документация

Способ № 2:

та же логика из posix_getpwuid (). Здесь вы должны передать имя пользователя целевой ОС вместо их uid.

$shell_user = posix_getpwnam('johndoe');
print_r($shell_user);

документация

зависит от того, где вы находитесь и что вы пытаетесь сделать.

$_SERVER совершенно ненадежно для несерверного скрипта, но $_ENV['HOME'] может быть лучше для стандартного сценария оболочки. Вы всегда можете print_r( $GLOBALS ) и посмотреть, что ваша среда дает вам играть. phpinfo() также выплевывает plaintxt при вызове из скрипта CLI, и просто хороший ole php -i выполняется из оболочки будет делать то же самое.

если по какой-либо причине getenv('HOME') не работает, или серверная ОС Windows, вы можете использовать exec("echo ~") или exec("echo %userprofile%") чтобы получить каталог пользователя. Конечно же

Это метод, который я использовал в недавнем проекте:

exec('echo $HOME')

Я сохранил его в свой объект, сделав это:

$this->write_Path  = exec('echo $HOME');

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

$_SERVER ['HOME'] и getenv ('home') не работали для меня.

однако на PHP 5.5+ это сработало, чтобы дать домашний каталог, в котором находится файл:

explode( '/', __FILE__ )[2]

попробовать $_SERVER['DOCUMENT_ROOT'] как ваш домашний каталог.

dirname(__DIR__);