c语言 - 使用 execve() 调用 "/usr/bin/env bash" 时无法定义变量



我想执行/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);
}

它返回这个错误:

bash: a=11: No such file or directory

我做错了什么?

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

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;

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

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

根据env(1(手册页:

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

bash的第一个非选项参数应该是要执行的脚本的名称。

要使用bash执行命令,需要使用-c选项。

例如,要执行

a=11; printf '%sn' "$a"

使用

bash -c 'a=11; printf '''%sn''' "$a"'

所以C代码是

#include <unistd.h>
void main(void) {
char *name[3];
name[0] = "bash";
name[1] = "-c";
name[2] = "a=11; printf '%sn' "$a"';
execvpe(name[0], name, NULL);
}

execve替换为execvpe以避免不得不使用env

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

相关内容

  • 没有找到相关文章

最新更新