Команда PHP exec (): как указать рабочий каталог?

Мой скрипт, назовем его execute.php, должен запустить скрипт оболочки, который находится в подпапке Scripts. Скрипт должен быть выполнен так, что его рабочий каталог – это скрипты. Как выполнить эту простую задачу в PHP?

Структура каталогов выглядит так:

execute.php Scripts/ script.sh 

Либо вы exec("cd Scripts && ./script.sh") в этот каталог в команде exec ( exec("cd Scripts && ./script.sh") ), либо вы измените рабочий каталог процесса PHP с помощью chdir() .

Текущий рабочий каталог совпадает с текущим рабочим каталогом скрипта PHP.

Просто используйте chdir() чтобы изменить рабочий каталог перед exec() .

Для большего контроля над тем, как будет выполняться дочерний процесс, вы можете использовать функцию proc_open () :

 $cmd = 'Scripts/script.sh'; $cwd = 'Scripts'; $spec = array( // can something more portable be passed here instead of /dev/null? 0 => array('file', '/dev/null', 'r'), 1 => array('file', '/dev/null', 'w'), 2 => array('file', '/dev/null', 'w'), ); $ph = proc_open($cmd, $spec, $pipes, $cwd); if ($ph === FALSE) { // open error } // If we are not passing /dev/null like above, we should close // our ends of any pipes to signal that we're done. Otherwise // the call to proc_close below may block indefinitely. foreach ($pipes as $pipe) { @fclose($pipe); } // will wait for the process to terminate $exit_code = proc_close($ph); if ($exit_code !== 0) { // child error } 

Если вам действительно нужен ваш рабочий каталог для сценариев, попробуйте:

 exec('cd /path/to/scripts; ./script.sh'); 

В противном случае,

 exec('/path/to/scripts/script.sh'); 

должно быть достаточно.

Это не лучший способ.

Передача следующего в функцию exec также будет выполняться ./scripts.sh, который теперь может удалить всю систему UNIX – при запуске в пути:

exec ('cd / patto / scripts; ./script.sh');

Используйте && (только для выполнения второй команды после успешного завершения первого) вместо; (полуколока) – это похоже на нажатие клавиши ввода.