我想执行/usr/bin/env
并打印出a=11
和b=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=11
和b=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,因此出现了错误。谢谢大家!