1

我的问题是双重的。

第一的:

是否可以在不使用子外壳的情况下实现这一目标?

FOO=$((6-5))

或这个?

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

如果我正确理解第二个,我将使用´|创建 2 个子外壳。

第二

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

- 谢谢

4

2 回答 2

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 个进程。

如果我们从“这里是一个字符串”开始删除无用的回声:

$ bash -c 'echo $$'
4256
$ BAR=`bc -l <<< "$FOO/100"`
$ bash -c 'echo $$'
4259

4259 - 4256 - 1 = 2. 现在启动了 2 个子进程。

似乎 echo 隐式分配了新的外壳?

  1. 反引号分配新的外壳 - 读取输出的新进程

  2. bc 分配新进程

此变体也将创建两个子流程:

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

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

  3. bc 将创建子进程

于 2013-05-01T06:11:08.990 回答
2

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

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

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

于 2013-05-01T12:23:21.607 回答