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



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

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和命令替换之间的区别,其中第二个将以与当前命令完全相同的方式失败。

最新更新