有这两个名称:subshell和child-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?
我正在将 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)
$()
.date
.$(date)
,它的值是替换的结果(我们可以在执行后得到)。$thedate
以备后用。printf
根据上面的命令,我们使用 , 显示变量保存的输出值。注意:\n
inprintf
是换行符。
到目前为止,我知道有两种主要方式:
显式:将括号括在命令列表中
隐式:管道中的每个命令
是否有更多的方式,无论是显式还是隐式,在 bash 中创建子shell?
为简单起见,参考以下代码
#!/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)