相关疑难解决方法(0)

子壳和子壳是一样的吗

有这两个名称:subshel​​lchild-shell

是的,子进程将通过以下任一方式启动:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Run Code Online (Sandbox Code Playgroud)

是否全部相同并共享相同的名称?所有共享相同的属性吗?


POSIX有这个定义

一个shell执行环境包括....

但是上面链接的最后一段是这样的:

子shell 环境应创建为shell 环境的副本,除了未被忽略的信号陷阱应设置为默认操作。

特别是:

命令替换、用括号分组的命令和异步列表应在子 shell 环境中执行。另外,多命令管道的每个命令都在一个子shell环境中;....

sh -c 'echo "Hello"'不包括有,应该是可以称为子shell?

shell bash process posix subshell

14
推荐指数
1
解决办法
4161
查看次数

什么是 shell 中的命令替换?

我正在将 Ubuntu 16.04 与 Bash 一起使用,我尝试在Wikipedia中阅读此处此处,但我无法理解一般 shell 脚本中“命令替换”的含义,特别是在 Bash 中,如下所示:

$(command)
Run Code Online (Sandbox Code Playgroud)

或者

`command`
Run Code Online (Sandbox Code Playgroud)

这个词的含义是什么?

编辑:当我第一次发布这个问题时,我已经知道替换的纯概念以及变量替换的 Linux 概念(通过执行替换变量的值),但我仍然从文档中错过了这个 shell 特性的目的原因或原因组。


问题锁定后我的回答

命令替换是一种具有专用语法的操作,用于执行命令并将该命令的输出保存(存储)在变量中以备后用。

一个例子date

thedate="$(date)"
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用以下命令打印结果printf

printf 'The date is %s\n' "$thedate"
Run Code Online (Sandbox Code Playgroud)
  1. 命令替换语法是$().
  2. 命令本身是date.
  3. 结合我们得到的$(date),它的值是替换的结果(我们可以在执行后得到)。
  4. 我们将该值保存在变量 中$thedate以备后用。
  5. printf根据上面的命令,我们使用 , 显示变量保存的输出值。

注意:\ninprintf是换行符。

command-substitution

11
推荐指数
1
解决办法
4万
查看次数

在 bash 中创建子shell的所有方法是什么?

到目前为止,我知道有两种主要方式:

  • 显式:将括号括在命令列表中

  • 隐式:管道中的每个命令

是否有更多的方式,无论是显式还是隐式,在 bash 中创建子shell?

bash subshell

5
推荐指数
1
解决办法
4417
查看次数

脚本函数调用:function vs $(function)

为简单起见,参考以下代码

#!/bin/bash

number=7

function doSomething() {
  number=8
}

doSomething
echo "$number"

Run Code Online (Sandbox Code Playgroud)

它打印8.

但与:

#!/bin/bash

number=7

function doSomething() {
  number=8
}

$(doSomething)
echo "$number"
Run Code Online (Sandbox Code Playgroud)

它打印7.

我有以下问题:

  • 每个的技术名称是什么?,我的意思是functioncall$(functioncall)
  • 每种方法如何工作?似乎前者考虑(影响)函数本身之外的变量,后者不考虑
  • 何时强制使用一种方法而不是另一种方法(主要是关于性能问题 - 当然 - 如果有的话),如果有其他原因,欢迎使用。

bash shell-script function command-substitution

3
推荐指数
1
解决办法
165
查看次数