我的脚本,我们称之为execute.php,需要启动一个位于Scripts子文件夹中的shell脚本。脚本必须执行,因此它的工作目录是Scripts。如何在PHP中完成这个简单的任务?
目录结构如下所示:
execute.php
Scripts/
script.sh
答案 0 :(得分:56)
您可以在exec命令(exec("cd Scripts && ./script.sh")
)中更改该目录,或者使用chdir()
更改PHP流程的工作目录。
答案 1 :(得分:24)
当前工作目录与PHP脚本的当前工作目录相同。
只需使用chdir()
在exec()
之前更改工作目录。
答案 2 :(得分:8)
为了更好地控制子进程的执行方式,您可以使用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
}
答案 3 :(得分:6)
如果您确实需要将工作目录作为脚本,请尝试:
exec('cd /path/to/scripts; ./script.sh');
否则,
exec('/path/to/scripts/script.sh');
应该足够了。
答案 4 :(得分:4)
这不是最好的方法:
exec('cd /patto/scripts; ./script.sh');
将此函数传递给exec函数将始终执行./scripts.sh,如果cd
命令失败,可能导致脚本无法使用正确的工作目录执行。
请改为:
exec('cd /patto/scripts && ./script.sh');
&&
是AND逻辑运算符。使用此运算符,只有在cd
命令成功时才会执行脚本。
这是一个使用shell优化表达式评估方式的技巧:因为这是一个AND操作,如果左边的部分没有计算为TRUE,那么整个表达式就不能评估为TRUE,所以shell赢了“ t事件处理表达式的正确部分。