bash - 从包装二进制文件调用脚本时未设置 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*}
出了什么问题?
谢谢,
解决方案
出了什么问题?
envp
可能在手册页中错误地指定为在NULL
linux 上:
在 Linux 上,可以将 argv 和 envp 指定为 NULL。在这两种情况下,
这与将参数指定为指向包含单个空指针的列表的指针具有相同的效果。 不要利用这种非标准和不可移植的错误功能!
您将其指定为NULL
,因此在子进程中环境为空,因此导出的变量hellthatrocks
不存在 - 因此检查失败。[ -v "$1" ]
$1=hellthatrocks
推荐阅读
- nginx - 反向代理到使用 NGINX 映射到 URL 路径的两个不同服务器
- android - 即使应用程序关闭,倒数计时器如何继续运行?
- haskell - 我该如何解决这个问题位于 ___ 的 GHC 无法编译健全性检查。(视窗)?
- android-studio - 他们要求为开发环境生成密钥哈希的密码是什么?
- c++ - 如何忽略来自 Bazel 中外部 C++ 依赖标头的警告
- node.js - findAll 返回空集,记录的原始查询返回所需的记录
- laravel - 安装 laravel 5.7 后是否需要执行“php artisan key:generate”命令
- c# - 获取不同对象列表的方法
- html - 使 bootstrap 4 单元格表现为条形图
- java - 在 Java 中使用泛型动态返回调用类的类型