在Linux中使用二进制环境变量时,我发现了一些奇怪的行为,似乎有些单个字节是坏的。我仔细检查了它,似乎某些字节在给setenv()时总是被错误地“转换”。看看这个:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char array[256];
int i;
for(i = 1; i < 256; i++) {
array[i] = i;
}
setenv("badenv", array, 1);
system("/bin/sh");
return 0;
}
我执行这个程序,然后当我回复$ badenv&gt;测试; hexdump测试我看到了:
0000000 0101 0302 0504 0706 2008 0c0b 0e0d 100f
0000010 1211 1413 1615 1817 1a19 1c1b 1e1d 201f
0000020 2221 2423 2625 2827 2a29 2c2b 2e2d 302f
0000030 3231 3433 3635 3837 3a39 3c3b 3e3d 403f
似乎0x9被转换为0x20,而0xa被转换为0xb等等。
我是否滥用setenv(),或者甚至我一般滥用环境变量?我查看了联机帮助页并搜索了一些,看看环境变量是否应该能够处理二进制值,但我不确定。
这种行为的原因是什么,有没有办法,还在使用环境变量?
答案 0 :(得分:4)
环境变量根据$IFS
的值分为“单词”,“单词”用单个分隔符连接 - 在本例中为普通空格。因此,在解释"\x09\x0a"
的内容时,序列"\t\n",
或'\x20'
会折叠为一个空格(array
)。
IFS - 内部字段分隔符,用于在扩展后进行单词拆分,并使用read builtin命令将行拆分为单词。默认值为''space tab newline''。
您可以通过(暂时)更改$IFS
来避免替换。
但请注意
array[0]
具有不确定的值array
不是0终止在您的计划中。你应该解决这个问题。