使用 execve() 调用“/usr/bin/env bash”时无法定义变量

Can't define variables when calling "/usr/bin/env bash" with execve()

我想执行/usr/bin/env并打印出a=11b=22。目前,我有:

#include <unistd.h>
void main() {
    char *name[3];
    name[0]="/usr/bin/env";
    name[1]="bash";
    name[2]=NULL;
    execve(name[0], name, NULL);
}

我可以 运行 它完美地打开 bash shell.

但是,我正在尝试定义和打印 a=11b=22。尝试定义 a=11 时,我在做:

#include <unistd.h>
void main() {
    char *name[4];
    name[0]="/usr/bin/env";
    name[1]="bash";
    name[2]="a=11";
    name[3]=NULL;
    execve(name[0], name, NULL);
}

它 returns 这个错误:

bash: a=11: No such file or directory

我做错了什么?

bash 的第一个 non-option 参数应该是要执行的脚本的名称。

要使用 bash 执行命令,您可以使用 -c 选项。

例如执行

a=11; printf '%s\n' "$a"

有人会用

bash -c 'a=11; printf '\''%s\n'\'' "$a"'

所以C代码是

#include <unistd.h>

void main(void) {
    char *name[3];
    name[0] = "bash";
    name[1] = "-c";
    name[2] = "a=11; printf '%s\n' \"$a\"';
    execvpe(name[0], name, NULL);
}

execve 替换为 execvpe 以避免必须使用 env

调换 env 参数的顺序。它期望变量赋值 (a=11) 在命令 (bash) 之前。

name[0]="/usr/bin/env";
name[1]="a=11";
name[2]="bash";
name[3]=NULL;

根据 env(1) man page:

SYNOPSIS
       env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
DESCRIPTION
       Set each NAME to VALUE in the environment and run COMMAND.

不确定您希望在哪里打印变量,但您需要这样的东西

name[0]="/usr/bin/env";
name[1]="a=11";
name[2]="b=22";
name[3]="bash";
name[4]="-c";
name[5]="printf \"%d %d\n\" $a $b";
name[6]=NULL;

成功了。我在bash之前没有定义a和b,就出现了错误。谢谢大家!