带有参数的子 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 和命令替换之间的差异,其中第二个将以与当前命令完全相同的方式失败。
当我直接执行以下命令时:
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 和命令替换之间的差异,其中第二个将以与当前命令完全相同的方式失败。