【发布时间】:2018-11-07 07:42:08
【问题描述】:
我想从 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() 调用可以用于临时脚本(例如这个),但不应该在生产中使用,因为它资源繁重且不安全。
【问题讨论】:
-
这很可能意味着
system没有运行与您相同的shell。 (您暗示您正在运行bash;很可能system()正在运行sh,而sh可能是dash或其他一些shell。)有更好的方法在C 中生成随机数,而无需运行system()— 尽管在 C 中生成随机数的某些方法也存在缺陷。当你看到system()时,想想“慢”。有时这是做事的好方法;有时(而且,IMO,这是其中之一)它不是。