首页 > 解决方案 > 从包装二进制文件调用脚本时未设置 Bash 变量

问题描述

我有以下代码,
bash脚本“tryme.sh”:

#!/usr/bin/env bash

PATH=$(/usr/bin/getconf PATH || /bin/kill $$)

PASS="hellthatrocks"

if [ ! -v "$1" ]; then
    echo "no.."
    echo "hell..."
    exit 1
fi

if test "$1" = "$PASS" ; then
    echo "yeah it is : $PASS"
else
    echo "humm..."
fi

exit 0

和包装二进制“wrapper.c”:

#include <unistd.h>

int main(int arc, char** arv) {
    char *argv[] = { "/bin/bash", "-p", "./tryme.sh", arv[1] , NULL };
    execve(argv[0], argv, NULL);
    return 0;
}

compiled gcc -o wrapper wrapper.c
export hellthatrocks="hellthatrocks"

问题是当我给出一个模式作为参数时,它在命令行中寻找定义的环境变量,例如:

./tryme.sh ${!h*}

它给了我,“是的,它是hellthatrocks”。

但是如果我从包装器中调用脚本,它不会找到变量并给出“不......地狱......”

./wrapper ${!h*}

出了什么问题?
谢谢,

标签: bashvariableswrapper

解决方案


出了什么问题?

envp可能在手册页中错误地指定为在NULLlinux 上:

在 Linux 上,可以将 argv 和 envp 指定为 NULL。在这两种情况下,
这与将参数指定为指向包含单个空指针的列表的指针具有相同的效果。 不要利用这种非标准和不可移植的错误功能!

您将其指定为NULL,因此在子进程中环境为空,因此导出的变量hellthatrocks不存在 - 因此检查失败。[ -v "$1" ]$1=hellthatrocks


推荐阅读