php exec bash脚本:没有这样的文件或目录

php exec bash脚本:没有这样的文件或目录,php,Php,我有一些bash和perl脚本,它们被要求通过基于web的界面执行。没什么特别的,只是为了方便取用。 PHP似乎是快速而肮脏的解决方案[通过exec()]。因此我关闭了php.ini中的安全模式并尝试 $output = array(); exec('/var/www/vhosts/default/htdocs/scripts/RUN.sh',$OUTPUT); print_r($output); var_dump($output); 现在找不到在RUN.sh脚本中访问的任何文件(通过相对路径

我有一些bash和perl脚本,它们被要求通过基于web的界面执行。没什么特别的,只是为了方便取用。 PHP似乎是快速而肮脏的解决方案[通过
exec()
]。因此我关闭了php.ini中的安全模式并尝试

$output = array();
exec('/var/www/vhosts/default/htdocs/scripts/RUN.sh',$OUTPUT);
print_r($output);
var_dump($output);
现在找不到在RUN.sh脚本中访问的任何文件(通过相对路径访问)。有没有什么方法可以让它在不给出脚本中访问的每个重定向(或任何文件)的完整路径的情况下工作


应用接受的解决方案后:

从脚本中说一行:

time python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits
echo "done"
time
-s输出被推送到错误日志文件时,“done”永远不会传递到$output数组。当在第页上打印时,exec()的第三个参数中的返回值给出了
0


更新:
time
命令将其输出到stderr,如果这样做`

t=`time some_command 2>&1`

然后在t中也没有存储任何内容。所以这是有道理的。感谢大家的帮助…

将当前工作目录更改为脚本本身的一部分

RUN.sh
脚本的角度来看,您的工作目录并不是您想象的那样。因此,脚本中的相对路径不会指向预期的位置

要修复它,您需要强制当前工作目录为使用相对路径的目录。因此,要么:

  • 使用绝对路径,或
  • 通过调用
    RUN.sh
    脚本中的
    cd[/absolute/path]
    更改当前工作目录,以强制其正确

在调用
exec()
之前,能否在PHP脚本中执行
chdir(2)
调用以获得所需的结果?或者这会不会让你的PHP解释器太难过?(使用CGI脚本,这一点都没有问题;但是FastCGI或类似的机制可能不太喜欢您。)

依赖相对路径名已经有点快和脏了,这只会使它永久化。也许修复脚本是更好的方法

编辑


我被重定向到
error\u log
而不是php页面的输出所困扰,知道为什么吗

这是程序将其输出发送到标准错误而不是标准输出的症状

但是
time
有一个复杂的问题——通常,当您运行
time
时,会得到
bash(1)
内置的
time
保留关键字。我找不到任何简单的方法要求
bash(1)
time
保留关键字输出发送到不同的文件描述符。但是,您也可以运行
time(1)
程序(位于
/usr/bin/time
中)。默认情况下,
time(1)
的输出变为标准错误,但您可以根据需要重定向输出:

$ /usr/bin/time echo hello
hello
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 2528maxresident)k
0inputs+0outputs (0major+206minor)pagefaults 0swaps
$ /usr/bin/time echo hello > /dev/null
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 2544maxresident)k
0inputs+0outputs (0major+207minor)pagefaults 0swaps
$ /usr/bin/time echo hello > /dev/null 2&>1
$ 
要使
time(1)
输出看起来更像
time
shell内置关键字输出,可以使用
-p
选项:

$ /usr/bin/time -p echo hello
hello
real 0.00
user 0.00
sys 0.00
因此,替换该行:

/usr/bin/time -p python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits 2>&1
用这句话:

/usr/bin/time -p python idsplitter.py OUTPUT/TMP/tokens OUTPUT/token_splits 2>&1

你应该准备好了。

你应该为
RUN.sh
设置工作目录。您可以在
exec
之前使用
chdir
,或者使用
exec-cd-WORKING\u目录/运行.sh
.Aah。。。嗯。。我快到了。。。RUN.sh中有一个
时间
,其输出应转到网页。但它不是这样工作的,输出被重定向到
/var/log/httpd/error\u log
。它一直打印
Array()数组(0){}
,就好像什么都没发生一样!嗯,你能把真实的剧本贴到某个地方让我仔细看看吗?更新了原来的帖子。。。感谢@normalocityI的帮助,我被重定向到错误日志而不是php页面的输出所困扰,知道为什么吗?