使用 execve() 调用“/usr/bin/env bash”时无法定义变量
Can't define variables when calling "/usr/bin/env bash" with execve()
我想执行/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);
}
它 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,就出现了错误。谢谢大家!
我想执行/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);
}
它 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,就出现了错误。谢谢大家!