Переменные оболочки трудно дублировать.
$ FOO=bar
$ FOO=zot
$ echo $FOO
zot
$
Однако переменные окружения могут дублироваться; это просто список, а в списке могут быть повторяющиеся записи. Вот envdup.c
, чтобы сделать именно это.
#include
#include
#include
#include
extern char **environ;
int main(int argc, char *argv[]) {
char **newenv;
int envcount = 0;
if (argc < 2) errx(64, "Usage: envdup command [args ..]");
newenv = environ;
while (*newenv++ != NULL) envcount++;
newenv = malloc(sizeof(char *) * (envcount + 3));
if (newenv == NULL) err(1, "malloc failed");
memcpy(newenv, environ, sizeof(char *) * envcount);
newenv[envcount] = "FOO=bar";
newenv[envcount+1] = "FOO=zot";
newenv[envcount+2] = NULL;
environ = newenv;
argv++;
execvp(*argv, argv);
err(1, "exec failed '%s'", *argv);
}
Который мы можем скомпилировать и запустить, сообщив envdup
, чтобы затем запустить env
, чтобы показать нам, какие переменные окружения установлены...
$ make envdup
cc envdup.c -o envdup
$ unset FOO
$ ./envdup env | grep FOO
FOO=bar
FOO=zot
$
Возможно, это полезно только для поиска ошибок или другие странности в том, насколько хорошо программы обрабатывают **окружение
.
$ unset FOO
$ ./envdup perl -e 'exec "env"' | grep FOO
FOO=bar
$ ./envdup python3 -c 'import os;os.execvp("env",["env"])' | grep FOO
FOO=bar
FOO=zot
$
Похоже, Python 3.6 здесь слепо пропускает дубликаты (дырявая абстракция), а Perl 5.24 — нет. Как насчет ракушек?
$ ./envdup bash -c 'echo $FOO; exec env' | egrep 'bar|zot'
zot
FOO=zot
$ ./envdup zsh -c 'echo $FOO; exec env' | egrep 'bar|zot'
bar
FOO=bar
$
Боже, что произойдет, если sudo
очистит только первую запись среды, а затем bash
запустится со второй? Здравствуйте, эксплойт PATH
или LD_RUN_PATH
. Ваш sudo
(и все остальные?) исправлены для этой дыры? Эксплойты безопасности не являются ни «случайным отличием», ни просто «ошибкой» в вызывающей программе.
В качестве временного решения, пока не обнаружите проблему, вы можете использовать pv
, чтобы ограничить пропускную способность, например, до 100 байт / сек:
pv -L 100 -q < ~/my_RML_file > /dev/ttyUSB0
На сайте startech в настоящее время представлено несколько последовательных кабелей USB < ->. И эти разные продукты используют разные чипсеты, то есть, по крайней мере, FTDI и Prolific. И только Prolific поддерживает аппаратное управление потоком.
Вы можете проверить, есть ли у вас USB-устройство Prolific или FTDI, взглянув на dmesg
при подключении устройства.
После проверки USB-кабеля вы можете отладить аппаратное управление потоком данных, запустивstatserial
в отдельном терминале.
Если ваше последовательное устройство не подключено напрямую к последовательному кабелю USB < ->, имеет смысл также проверить соединения этого дополнительного кабеля.