我需要在循环中执行带有不同args的unix命令.现在我想知道我是否应该使用execvp(),传入cmd和args,或使用系统,构建一个由cmd + args组成的字符串?
我在生产服务器上使用php 5.2.9,似乎exec()函数表现为"非标准".
如果我运行,exec("ls", $output, $return_var)那么$output将按预期包含当前文件夹中的文件列表,但$return_var将按预期设置为-1而不是0.我正在使用它$return_var来确定命令在哪里成功完成,并在测试的每个其他服务器上按预期工作:)
有没有人遇到过这样的情况?
编辑:
<?php
$command = "asd";
$t1 = time();
$output = Array();
$result = -5;
$r = exec($command, $output, $result);
$t2 = time();
echo "<pre>";
var_export(Array(
'command'=>$command,
'result'=>$result,
'output'=>implode("\n", $output),
'r'=>$r,
't2-t1'=>$t2-$t1,
));
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)
无论我输入什么命令$command,$result总是-1,即使对于不存在的命令......这很奇怪
我看到的时候正在研究linux C++编程
int execve(const char *path,
char *const argv[],
char *const envp[]);
Run Code Online (Sandbox Code Playgroud)
我不明白是什么char *const argv[].我知道char *const foo是一个指向char的const指针.并且const char *foo是一个指向const char的指针.但是什么char *const argv[]?
它是char的const指针数组还是const char的指针数组?
我有一个vector<string>现在,如何将其转换为char *const argv[]?
假设我有一个这样的TCL脚本:
exec ls -l
Run Code Online (Sandbox Code Playgroud)
现在这将打印出当前目录的内容.我需要将该输出作为字符串并解析它.我怎么能这样做?
例:
ClassName.php
<?php echo "This will crash all"; ?>
Run Code Online (Sandbox Code Playgroud)
在另一个档案中......
foreach ($FILENAMES_WITHOUT_DOT_PHP as $name => $value) {
if (class_exists( $value )) {
echo "ClassName exists...";
}
else {
echo "ClassName doesn't exists....";
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码的输出是: 这会崩溃所有
而不是这样: ClassName不存在....
自动加载功能:
function __autoload( $var_class )
{
require_once( "$var_class.php") ;
}
Run Code Online (Sandbox Code Playgroud) 我在SO上查看了无数的"Python exec"主题,但找不到能解决我问题的主题.非常抱歉,如果之前有人问过这个问题.这是我的问题:
# Python 2.6: prints 'it is working'
# Python 3.1.2: "NameError: global name 'a_func' is not defined"
class Testing(object):
def __init__(self):
exec("""def a_func():
print('it is working')""")
a_func()
Testing()
Run Code Online (Sandbox Code Playgroud)
# Python 2.6: prints 'it is working'
# Python 3.1.2: prints 'it is working'
class Testing(object):
def __init__(self):
def a_func():
print('it is working')
a_func()
Testing()
Run Code Online (Sandbox Code Playgroud)
由于标准函数定义适用于两个Python版本,我假设问题必须是对exec工作方式的改变.我阅读了2.6和3的API文档,并exec阅读了"Python 3.0中的新功能"页面,并且看不出代码中断的任何原因.
python metaprogramming exec backwards-compatibility python-3.x
我正在寻找一种最有效的方法来决定:
众所周知,要从Java启动shell脚本,应该启动shell:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)
要启动二进制文件,应该启动二进制文件:
ProcessBuilder pb = new ProcessBuilder("/path/binary", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)
如果使用shell执行二进制文件,则会产生错误:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "/path/binary", "arg1", "arg2);
(sh: cannot execute binary file)
Run Code Online (Sandbox Code Playgroud)
如果在没有shell二进制文件的情况下执行shell脚本,则会产生错误:
ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
(error 2: file not found)
Run Code Online (Sandbox Code Playgroud)
我的情况是我的应用程序不知道它的启动,二进制或脚本.
启动的应用程序是最终用户提供的事件处理程序.它很可能是在Unix下执行的shell脚本; 但它可以是Windows下的*.cmd,或者是在一些不起眼的平台下执行的Perl脚本.毕竟它是Java.
我的第一个天真的尝试是用shell启动命令行,看它是否有效.如果没有,请尝试将其作为二进制文件执行.
这是丑陋和冒险的:在平台和shell的一些未知组合下,第二次运行仍然可能仍然执行脚本,第二次,具有不可预测的结果.
此外,我无法判断脚本何时启动正常并且由于某些问题而失败,因为我无法启动它.
我现在正在考虑的最好的事情是:
如果您有任何更好的想法,请告知.
更新/部分解决方案
感谢所有与我分享他们想法的人.
事实证明,我把自己和互联网的其他部分弄糊涂了:)
在用户输入的命令行之前不需要在应用二进制文件前加前缀,前提是:
当我测试我的代码时,这些条件中的一个或另一个没有达到.:-(
从临时脚本执行测试后,脚本已经执行完毕.
第3点只能由用户完成,并且必须在用户手册中记录.
由于这些脚本传播到目标系统的方式,它们可能不可执行,可能不在PATH中.
我关心的唯一路径是相对路径,因此将./添加到任何相对路径就足够了.
使脚本在Unix(以及任何其他平台)下可执行是一个更大的挑战.这不是WORA.在它前面放置/ bin/sh可能会有所帮助,但如果我记得在Solaris下,shell将不会执行不可执行的脚本. …
我想从数据库创建备份,但我只得到一个空白文件.
include('config.php');
$command = "mysqldump --opt -h ".$_host." -u ".$_user." -p ".$_pass." ".$_db." > test.sql";
exec($command);
echo "<br />".$command;
Run Code Online (Sandbox Code Playgroud)
在.php文件所在的位置创建test.sql.
编辑:
注意!我正在使用XAMPP WINDOWS!
解:
因为我使用的是Windows Web服务器(XAMPP),所以我需要指定路径:
$command = 'd:\xampp\mysql\bin\mysqldump --opt -u '.$_user.' -p'.$_pass.' '.$_db.' > test.sql';
Run Code Online (Sandbox Code Playgroud)
-pMYPASSWORD"为'我想如果您使用的是基于Linux的Web服务器,则不必指定mysqldump的路径.
干杯! :-)
我在我的php脚本中调用它:
exec("gutschein.php >/dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)
调用脚本(生成pdf并通过电子邮件发送)可以正常工作,但是进程没有在后台运行(我在gutschein.php中使用sleep语句检查了它).浏览器一直挂起,直到执行gutschein.php完成.
我还检查了以下内容:
exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)
要么
shell_exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)
它没有改变任何东西.该脚本实际上是在linux服务器上运行的.有谁知道我做错了什么?
如何从Swift脚本调用外部命令(启动子进程)?
也许就像call(["ls", "-l"])在Python中一样.