首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数学计算结果赋值给没有子外壳的变量。

将数学计算结果赋值给没有子外壳的变量。
EN

Stack Overflow用户
提问于 2013-05-01 04:04:47
回答 2查看 2.1K关注 0票数 1

我的问题是双重的。

First:

在不使用子subshell的情况下,是否有可能做到这一点?

代码语言:javascript
运行
复制
FOO=$((6-5))

还是这个?

代码语言:javascript
运行
复制
BAR=`echo "$FOO/100" | bc -l`

如果我正确地理解了第二个子subshells,我将使用\\创建两个子subshells

第二

为这类内容创建/使用子overall是否会影响脚本的整体性能?

--谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-01 06:11:08

您可以检查使用该简单行分配的子进程计数:

代码语言:javascript
运行
复制
bash -c 'echo $$'

它创建新的shell并输出当前进程id。

因为linux中的进程是序列号,所以我们可以使用这个“黑客”来检测命令之间启动了多少进程。(某些进程可以通过cron或at在后台启动,因此需要多次检查结果)。

此外,此命令将启动进程,因此如果您多次启动它,您将看到越来越多的进程。若要获得在此命令之间启动的进程的实际数量,必须将其减为1。

所以开始检查。

代码语言:javascript
运行
复制
$ bash -c 'echo $$'
4240
$ FOO=$((6-5))
$ bash -c 'echo $$'
4241

4241 - 4240 - 1 = 0。没有启动子进程。

代码语言:javascript
运行
复制
$ FOO=1111
$ bash -c 'echo $$'
4244
$ BAR=`echo "$FOO/100" | bc -l`
$ bash -c 'echo $$'
4248

4248 - 4244 - 1 = 3。有3个过程已经启动。

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

代码语言:javascript
运行
复制
$ bash -c 'echo $$'
4256
$ BAR=`bc -l <<< "$FOO/100"`
$ bash -c 'echo $$'
4259

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

似乎回显隐式地分配新的shell?

  1. backticks分配新的shell -读取输出的新进程。
  2. bc分配新工艺

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

代码语言:javascript
运行
复制
read BAR < <(bc -l <<< "$FOO / 100")
  1. read是bash命令,它不对子进程进行分叉,而是在同一个shell中执行。
  2. ()将创建shell子进程。
  3. bc将创建子进程。
票数 3
EN

Stack Overflow用户

发布于 2013-05-01 12:23:21

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

代码语言:javascript
运行
复制
$ count=5
$ : $(( count++ ))
$ echo $count
6

如果$(( ... ))创建了一个子still,那么下面的echo的输出仍然是5。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16312575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档