首先
是否可以在不使用子shell的情况下实现此目的?
FOO=$((6-5))
还是这个?
BAR=`echo "$FOO/100" | bc -l`
如果我理解第二个,我使用'和 |
创建2个子shell第二
为这种东西创建/使用子shell是否会影响脚本的整体性能?
- 感谢
答案 0 :(得分:3)
您可以检查使用该简单行分配的子进程的计数:
bash -c 'echo $$'
它创建新shell并输出当前进程ID。
由于linux中的进程是序列号,我们可以使用此“hack”来检测命令之间启动的进程数。 (某些进程可以通过cron或at在后台启动,因此需要多次检查结果)。
此命令也将启动进程,因此如果您多次启动它,您将看到越来越多的数字。要获得在此命令之间启动的进程的实际计数,必须减去1。
所以开始检查。
$ bash -c 'echo $$'
4240
$ FOO=$((6-5))
$ bash -c 'echo $$'
4241
4241 - 4240 - 1 = 0
。没有启动子进程。
$ FOO=1111
$ bash -c 'echo $$'
4244
$ BAR=`echo "$FOO/100" | bc -l`
$ bash -c 'echo $$'
4248
4248 - 4244 - 1 = 3
。已经开始了3个过程。
如果我们从“here is a string”开始删除无用的echo:
$ bash -c 'echo $$'
4256
$ BAR=`bc -l <<< "$FOO/100"`
$ bash -c 'echo $$'
4259
4259 - 4256 - 1 = 2
。现在启动了2个子流程。
似乎echo隐式分配新shell ??
反引号分配新shell - 新进程以读取输出
bc分配新流程
此变体也会创建两个子进程:
read BAR < <(bc -l <<< "$FOO / 100")
read是一个bash命令 - 它不分叉子进程并在同一个shell中执行
()将创建shell - 子流程
bc将创建子流程
答案 1 :(得分:2)
查看$(( ... ))
未调用子shell的一种方法是修改构造内变量的值,并看到更改在当前shell中可见。
$ count=5
$ : $(( count++ ))
$ echo $count
6
如果$(( ... ))
创建了子shell,则以下echo
的输出仍为5。