簡體   English   中英

使用 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);
}

它返回此錯誤:

bash: a=11: No such file or directory

我究竟做錯了什么?

bash的第一個非選項參數應該是要執行的腳本的名稱。

要使用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的 arguments 的順序。它期望變量賦值 ( 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.

不確定您希望在哪里打印變量,但是您需要這樣的東西

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,就報錯了。 謝謝你們!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM