标签: exec

何时使用system()以及何时使用execv*()?

我需要在循环中执行带有不同args的unix命令.现在我想知道我是否应该使用execvp(),传入cmd和args,或使用系统,构建一个由cmd + args组成的字符串?

c unix exec

12
推荐指数
3
解决办法
3253
查看次数

exec总是返回-1(或127)

我在生产服务器上使用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,即使对于不存在的命令......这很奇怪

php linux exec

12
推荐指数
1
解决办法
5700
查看次数

什么是char*const argv []?

我看到的时候正在研究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[]

c++ pointers const exec char

12
推荐指数
1
解决办法
1万
查看次数

如何获得TCL exec命令的结果(标准输出)?

假设我有一个这样的TCL脚本:

exec ls -l 
Run Code Online (Sandbox Code Playgroud)

现在这将打印出当前目录的内容.我需要将该输出作为字符串并解析它.我怎么能这样做?

tcl exec

12
推荐指数
1
解决办法
2万
查看次数

有一种方法可以使用CLASS_EXISTS和__autoload而无需CRASH脚本吗?

例:

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)

php exec autoload

11
推荐指数
3
解决办法
1万
查看次数

为什么Python 3更改为exec会破坏此代码?

我在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

11
推荐指数
2
解决办法
2663
查看次数

Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二进制文件?

我正在寻找一种最有效的方法来决定:

  • 我应该使用shell可执行文件预先提供用户提供的命令行
  • 如果是,那可执行文件是什么?(/ bin/sh?/ usr/bin/perl?/ usr/bin/ksh?c:/../ cmd.exe?)

众所周知,要从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的一些未知组合下,第二次运行仍然可能仍然执行脚本,第二次,具有不可预测的结果.

此外,我无法判断脚本何时启动正常并且由于某些问题而失败,因为我无法启动它.

我现在正在考虑的最好的事情是:

  • 阅读脚本并查找任何不可打印的字节
  • 如果找到,请将其视为二进制
  • 如果没有,请添加/ bin/sh(如果在Windows下,则添加cmd.exe)

如果您有任何更好的想法,请告知.

更新/部分解决方案

感谢所有与我分享他们想法的人.

事实证明,我把自己和互联网的其他部分弄糊涂了:)

在用户输入的命令行之前不需要在应用二进制文件前加前缀,前提是:

  1. 该脚本位于PATH中
  2. (对于Unix)脚本是可执行的
  3. (对于Unix)脚本有#!/ path/to/interpreter

当我测试我的代码时,这些条件中的一个或另一个没有达到.:-(

从临时脚本执行测试后,脚本已经执行完毕.

第3点只能由用户完成,并且必须在用户手册中记录.

由于这些脚本传播到目标系统的方式,它们可能不可执行,可能不在PATH中.

我关心的唯一路径是相对路径,因此将./添加到任何相对路径就足够了.

使脚本在Unix(以及任何其他平台)下可执行是一个更大的挑战.这不是WORA.在它前面放置/ bin/sh可能会有所帮助,但如果我记得在Solaris下,shell将不会执行不可执行的脚本. …

java shell exec processbuilder

11
推荐指数
1
解决办法
4887
查看次数

php exec() - mysqldump创建一个空文件

我想从数据库创建备份,但我只得到一个空白文件.

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)
  1. 我删除了-p和pass之间的空格.看起来像:-pMYPASSWORD
  2. 替换"'

我想如果您使用的是基于Linux的Web服务器,则不必指定mysqldump的路径.

干杯! :-)

php mysql mysqldump exec

11
推荐指数
1
解决办法
2万
查看次数

PHP:exec()即使使用">/dev/null 2>&1&"也不会在后台运行

我在我的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服务器上运行的.有谁知道我做错了什么?

php background process exec

11
推荐指数
1
解决办法
8335
查看次数

在Swift中调用外部命令

如何从Swift脚本调用外部命令(启动子进程)?

也许就像call(["ls", "-l"])在Python中一样.

exec swift

11
推荐指数
1
解决办法
2434
查看次数