C генерирует правильную команду оболочки, но вызов system () возвращает неожиданные значения - PullRequest
0 голосов
/ 28 мая 2018

Я хочу выполнить эту команду оболочки из C: var=19; RANDOM=$var; v1=$RANDOM; v2=$RANDOM; echo $var $v1 $v2 Оболочка Ubuntu возвращает: 19 24421 24549 следующее случайное число на основе начального числа, как и ожидалось.Однако

#include <stdio.h>
#include <string.h>

int main (void) {
    char buffer[200];
for( int a = 18; a < 20; a = a + 1 ){   
     snprintf(buffer, sizeof buffer, "%s%d%s", "var=", a, "; RANDOM=$var; v1=$RANDOM; v2=$RANDOM; echo $var $v1 $v2");
    printf("%s\n", buffer);
     system(buffer);
    }
    return 0;
}

var=18; RANDOM=$var; v1=$RANDOM; v2=$RANDOM; echo $var $v1 $v2 18 18 18 var=19; RANDOM=$var; v1=$RANDOM; v2=$RANDOM; echo $var $v1 $v2 19 19 19

Командная строка верна, но значения не обновляются.Что вызывает это поведение?


На всякий случай.System() вызов вполне допустим для скриптов (вроде этого), но его не следует использовать в производственном процессе, поскольку он требует значительных ресурсов и небезопасен.

1 Ответ

0 голосов
/ 28 мая 2018

Ubuntu (по состоянию на 18.04) поставляется с тремя отдельными оболочками в стиле Борна.

Существует множество функций bash, используемых в качестве оболочки входа пользователя по умолчанию:

$ bash -c 'var=19; RANDOM=$var; v1=$RANDOM;  v2=$RANDOM; echo $var $v1 $v2'
19 24421 24549

У вас естьВстроенный в BusyBox ash, используемый для ранней загрузки:

$ busybox ash -c 'var=19; RANDOM=$var; v1=$RANDOM;  v2=$RANDOM; echo $var $v1 $v2'
19 31262 30375

И быстрый и экономичный dash, используемый в качестве системной оболочки по умолчанию:

$ dash -c 'var=19; RANDOM=$var; v1=$RANDOM;  v2=$RANDOM; echo $var $v1 $v2'
19 19 19

Поскольку RANDOM являетсяне стандартная функция оболочки, она ведет себя по-разному между ними.Bash и Ash дают две разные случайные последовательности, в то время как Dash рассматривает ее как обычную переменную.

Когда вы открываете терминал, оболочка имеет значение bash.Когда вы вызываете system(), он вызывает /bin/sh, который в Ubuntu равен dash.Вот почему все по-другому.

...