将数学计算的结果分配给没有子shell的变量

时间:2013-05-01 04:04:48

标签: bash math bc subshell

我的问题是双重的。

首先

是否可以在不使用子shell的情况下实现此目的?

FOO=$((6-5))

还是这个?

BAR=`echo "$FOO/100" | bc -l`

如果我理解第二个,我使用' |

创建2个子shell

第二

  

为这种东西创建/使用子shell是否会影响脚本的整体性能?

- 感谢

2 个答案:

答案 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 ??

  1. 反引号分配新shell - 新进程以读取输出

  2. bc分配新流程

  3. 此变体也会创建两个子进程:

    read BAR < <(bc -l <<< "$FOO / 100")
    
    1. read是一个bash命令 - 它不分叉子进程并在同一个shell中执行

    2. ()将创建shell - 子流程

    3. bc将创建子流程

答案 1 :(得分:2)

查看$(( ... ))未调用子shell的一种方法是修改构造内变量的值,并看到更改在当前shell中可见。

$ count=5
$ : $(( count++ ))
$ echo $count
6

如果$(( ... ))创建了子shell,则以下echo的输出仍为5。