带有参数的子 shell 执行命令的奇怪行为

strange behaviour of a subshell executing command with arguments

当我直接执行以下命令时:

root@busybox-694d76bb5d-2gcvh:/# mysql -hmariadb -P3306 -uroot -ppassword -e 'SELECT 1'

我得到以下输出:

mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 1 |
+---+

但是,子 shell 中的相同命令,如下所示:

$(mysql -hmariadb -P3306 -uroot -ppassword -e 'SELECT 1')

输出:

mysql: [Warning] Using a password on the command line interface can be insecure.
bash: 1: command not found

为什么 bash 将我作为参数发送的“1”解释为在子 shell 中发送时就好像它是一个单独的命令一样?

bash 解释的参数的一部分不是 1,而是命令的输出。

首先,你需要知道mysql有两种默认的输出模式:table and raw。当命令的输出流是终端并打印人类可读的输出时,使用第一个。第二个用于其他用途并打印易于由脚本操作的输出。您可以使用我已链接其文档的选项强制执行其中一个。

其次,您需要知道简单 (subshell)$(command substitution) 之间的区别:在这两种情况下,子 shell 中的命令都是 运行,但是命令替换的输出该命令被替换为原始命令行,然后被执行。

所以当您编写 $(mysql command) 时发生的事情是它的输出是 1(原始结果)而不是您之前看到的 table,然后无法解析作为命令。

通过测试 (echo 1)$(echo 1) 之间的差异,您可以更轻松地看到子 shell 和命令替换之间的差异,其中第二个将以与当前命令完全相同的方式失败。