代码之家  ›  专栏  ›  技术社区  ›  Stepan

C生成正确的shell命令,但System()调用返回意外的值

  •  0
  • Stepan  · 技术社区  · 8 年前

    我想从C执行这个shell命令: var=19; RANDOM=$var; v1=$RANDOM; v2=$RANDOM; echo $var $v1 $v2 Ubuntu shell返回: 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 回复  |  直到 8 年前
        1
  •  4
  •   that other guy    8 年前

    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 不是标准的shell功能,它们之间的行为不同。bash和ash给出了两个不同的随机序列,而dash只是把它当作一个正则变量。

    当你打开终端时,外壳是 猛击 . 当你打电话的时候 system() ,它调用 /bin/sh Ubuntu上的哪个 短跑 . 这就是它与众不同的原因。