问题锁定后我的回答

问题锁定后我的回答

我正在使用 Ubuntu 16.04 和 Bash,我尝试读入维基百科, 在这里并在这里,但我无法理解 shell 脚本中“命令替换”的含义,特别是 Bash 中的含义,如下所示:

$(command)

或者

`command`

这个词的含义是什么?

编辑:当我第一次发布这个问题时,我已经知道了纯粹的替换概念以及 Linux 的概念变量替换(通过执行用变量的值替换变量),但出于某种原因或多种原因,我仍然从文档中错过了此 shell 功能的用途。


问题锁定后我的回答

命令替换是一种具有专用语法的操作,既可以执行命令,又可以使该命令的输出由变量保存(存储)以供以后使用。

一个例子date

thedate="$(date)"

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

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

注意:\ninprintf是换行符。

答案1

“命令替换”是 shell 语言的功能名称,它允许您执行命令并让该命令的输出替换(替换)命令的文本。

shell 语言没有其他功能可以让您执行此操作。

命令替换,即整个$(...)表达式,是被取代通过其输出,这是命令替换的主要用途。

命令替换执行的命令是在子 shell 中执行的,这意味着它有自己的环境,不会影响父 shell 的环境。

不过,并非所有子 shell 执行都是命令替换(请参阅末尾的更多示例)。

显示在子 shell 中执行命令替换的示例:

$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123

此处,变量s设置为字符串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 中的值( 的值s仍然是123,而不是world)。

还有其他一些情况需要在子 shell 中执行命令,例如

echo 'hello' | read message

在 中bash,除非您设置该lastpipe选项(仅在非交互式实例中),否则read将在子 shell 中执行,这意味着$message不会在父 shell 中更改,即echo "$message"在上述命令之后执行将回显空字符串(或任何值)$message是之前)。

进程替换bash也在子 shell 中执行:

cat < <( echo 'hello world' )

这也与命令替换不同。

答案2

a=$(command)

将把 的结果值存储command到变量中。

真的没有更多了。

作为旁注,我相信:

a=`command`

已被弃用,其含义与上述相同。

相关内容