Играя с бинарными переменными среды в 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;
}
Я запускаю эту программу, затем, когда я делаю echo $badenv > test; шестнадцатеричный тест я вижу:
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() или, может быть, вообще злоупотребляю переменными окружения? Я просмотрел справочную страницу и обыскал некоторые, чтобы узнать, должны ли переменные среды обрабатывать двоичные значения или нет, но я не уверен.
В чем причина такого поведения, есть ли способ обойти это, все еще используя переменные среды?
export a=
echo -e \t` дает то же самое, заменив табуляцию пробелом. - person elmo   schedule 02.04.2013setenv
ожидает в качестве значения переменной строку, заканчивающуюся 0 (также известную как строка в стиле C), значение, очевидно, не может быть произвольным двоичным данными, потому что оно не будет хорошо обрабатывать 0 байтов. Я не знаю, почему он преобразует управляющие символы, такие как0x9
, в пробелы. Скорее всего какая-то мера безопасности. - person shakurov   schedule 02.04.2013