我的问题是双重的。
第一的:
是否可以在不使用子外壳的情况下实现这一目标?
FOO=$((6-5))
或这个?
BAR=`echo "$FOO/100" | bc -l`
如果我正确理解第二个,我将使用´和|创建 2 个子外壳。
第二
为这种东西创建/使用子shell会影响脚本的整体性能吗?
- 谢谢
您可以检查使用该简单行分配的子进程的计数:
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 个进程。
如果我们从“这里是一个字符串”开始删除无用的回声:
$ bash -c 'echo $$'
4256
$ BAR=`bc -l <<< "$FOO/100"`
$ bash -c 'echo $$'
4259
4259 - 4256 - 1 = 2
. 现在启动了 2 个子进程。
似乎 echo 隐式分配了新的外壳?
反引号分配新的外壳 - 读取输出的新进程
bc 分配新进程
此变体也将创建两个子流程:
read BAR < <(bc -l <<< "$FOO / 100")
read 是一个 bash 命令 - 它不会派生子进程并在同一个 shell 中执行
() 将创建 shell - 子进程
bc 将创建子进程
查看$(( ... ))
不调用子shell 的一种方法是修改构造内部变量的值,并查看更改在当前shell 中可见。
$ count=5
$ : $(( count++ ))
$ echo $count
6
如果子shell 是由 创建的$(( ... ))
,则以下输出echo
仍为 5。