我使用Ubuntu 16.04使用bash和我试图在阅读维基百科,在这里和在这里,但我不明白“命令替换”在一般的shell脚本的含义,并且在猛砸特别,如:
$(command)
或者
`command`
这个名词是什么意思?
编辑:当我第一次发布这个问题时,我已经知道替换的纯概念以及变量替换的Linux概念(通过执行将变量替换为其值),但是无论如何我仍然错过了此shell功能的目的原因或一组原因。
命令替换是一种具有专用语法的操作,既可以执行命令,也可以由变量保存(存储)此命令的输出,以备后用。
date
:thedate="$(date)"
然后,我们可以使用以下命令打印结果printf
:
printf 'The date is %s\n' "$thedate"
$()
。date
。$(date)
的结果,它的值是替换的结果(执行后我们可以得到)。$thedate
,以备后用。printf
根据上面的命令,使用来显示变量所保存的输出值。注意:\n
inprintf
是换行符。
“命令替换”是Shell语言功能的名称,它使您可以执行命令并让该命令的输出替换(替代)命令的文本。
Shell语言没有其他功能可以使您做到这一点。
命令替换(即整个$(...)
表达式)被其输出替换,这是命令替换的主要用途。
命令替换执行的命令在子Shell中执行,这意味着它具有自己的环境,不会影响父Shell的环境。
不过,并非所有子Shell执行都是命令替换(请参阅最后的其他示例)。
显示在子shell中执行命令替换的示例:
$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123
在这里,变量s
设置为string 123
。在下一行,echo
在包含命令替换结果的字符串上调用。命令替换设置s
为字符串world
并回显此字符串。字符串world
是命令替换中命令的输出,因此,如果在命令下运行该字符串set -x
,我们将看到上面的第二行将被扩展为echo 'hello world'
,这将hello world
在终端上生成:
$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world
(在跟踪输出中的命令替换子shell的每个级别上bash
添加了额外级别的+
提示,其他shell可能不会这样做)
最后,我们显示了命令替换内的命令在其自己的子Shell中运行,因为它不影响s
调用Shell中的value(的值s
仍然是123
,而不是world
)。
在其他情况下,命令在子外壳中执行,例如
echo 'hello' | read message
在中bash
,除非您设置lastpipe
选项(仅在非交互式实例中),否则它将read
在子shell中执行,这意味着$message
将不会在父shell中进行更改,即echo "$message"
在执行上述命令后将回显一个空字符串(或任何值)$message
之前)。
进程替换bash
也将在子shell中执行:
cat < <( echo 'hello world' )
这也与命令替换不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句