>当我直接执行以下命令时:
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 |
+---+
但是,子外壳中的相同命令如下所示:
$(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 中发送时是一个单独的命令?
不是1
是 bash 解释的参数的一部分,而是命令的输出。
首先,您需要知道mysql
有两种默认的输出模式:表和原始。当命令的输出流是终端并打印人类可读的输出时,使用第一个。第二个以其他方式使用,并打印易于由脚本操作的输出。您可以使用我链接其文档的选项强制其中一个。
其次,您需要知道简单(subshell)
和$(command substitution)
之间的区别:在这两种情况下,命令都在子shell中运行,但是通过命令替换,命令的输出在原始命令行中被替换,然后执行。
因此,当您编写$(mysql command)
时发生的情况是,它的输出是1
(原始结果)而不是您之前看到的表,然后无法将其解析为命令。
通过测试(echo 1)
和$(echo 1)
之间的差异,您可以更轻松地查看子shell和命令替换之间的区别,其中第二个将以与当前命令完全相同的方式失败。