我在 DigitialOcean 等“自我管理的 shell”托管提供商上使用 Ubuntu 和 Bash 创建了几个服务器环境,我在其上运行 Drupal/WordPress 应用程序。
一直以来,我都没有必要使用所谓的“命令替换”。
我问,Bash 程序员必须使用这个概念的“模式”会是什么问题?请举个例子?
我在 DigitialOcean 等“自我管理的 shell”托管提供商上使用 Ubuntu 和 Bash 创建了几个服务器环境,我在其上运行 Drupal/WordPress 应用程序。
一直以来,我都没有必要使用所谓的“命令替换”。
我问,Bash 程序员必须使用这个概念的“模式”会是什么问题?请举个例子?
命令替换意味着运行 shell 命令并将其输出存储到变量或使用 echo 命令显示回。例如,显示日期和时间:
它在我的命令接收另一个命令或示例的输出作为参数的情况下很有用。
来自POSIX 标准中的命令替换小节:
命令替换提供了一种使用命令输出的简便方法,而无需先将其写入临时文件,然后再从该文件中读取。如果命令的输出是单行的短字符串,则最好这样做。
有些人使用命令替换来收集命令的输出,即使输出量可能是一个多行文档。这通常不是使用命令替换的好方法。相反,应该使用使用管道或临时文件在处理阶段之间传递数据的标准 Unix 习惯用法。
我使用的命令替换示例:
例如,要确定当前用户是否以 root 身份执行脚本:
命令替换将
$(id -u)
替换为 的输出id -u
,这将返回当前用户的 UID(整数)。另一个例子。我正在使用 GnuPG 来签署
git
提交。为了使 GnuPG 正常工作,我需要GPG_TTY
在我的交互式 shell 的初始化文件中设置当前终端设备的名称。我这样做这取决于当前终端设备在 shell 会话中的设置
GPG_TTY
。/dev/ttyp4
另一个例子。我有一个脚本必须将在 Solaris 机器上运行视为一种特殊情况:
另一个例子。该
getconf PATH
命令返回当前系统的“默认路径”。我在某些情况下使用它来将PATH
变量重置为“合理的默认”值:我经常使用它
find
,例如:此外,作为穷人 IDE 的一部分:
以上是命令行示例。我也在脚本中经常使用它,没有它我会很难过。最常见的情况可能如上所述,从命令的输出设置 shell 变量:
我按照老习惯使用反引号,但
$(command)
语法要好得多,因为你可以将一个嵌入另一个。使用反引号,您必须知道将转义\
字符放在哪里,这很麻烦。另一个例子:
在 Docker 中,您可以使用以下方法清理停止的容器:
您还可以获取已停止运行的容器的 ID:
所以你可以清理所有停止的容器:
...其中生成的 ID
docker ps
被替换为命令$(docker ps...)
要使用的字符串docker rm
。使这种用法成为必要的实现模式是 Unix shell 在子进程中执行每个非内置命令。子进程不能修改其父进程的上下文。命令替换可以导致 shell 使用非内置命令的文本输出,就好像它是在 shell 脚本中编写的或在命令行上键入的一样。