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

时间:2019-03-18 09:56:09

标签: bash subshell

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

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在子shell中发送时,为什么bash会将我发送的“ 1”解释为一个单独的命令?

1 个答案:

答案 0 :(得分:4)

bash解释的不是参数>> caesar('blabla', 1) ans = 'cmbcmb' >> caesar('cmbcmb', -1) ans = 'blabla' >> caesar('blabla', 1000) ans = '5?45?4' >> caesar('5?45?4', -1000) ans = 'blabla' ,而是命令的输出。

首先,您需要知道1有两种默认的输出模式:tableraw。当命令的输出流是终端并打印人类可读的输出时,使用第一个。否则使用第二个,并输出易于通过脚本操作的输出。您可以使用我链接了其文档的选项来强制使用其中一个。

第二,您需要了解简单的mysql(subshell)之间的区别:在两种情况下,命令都在子shell中运行,但是使用命令替换,命令的输出将替换为原始命令行,然后执行。

因此,当您编写$(command substitution)时发生的事情是它的输出是$(mysql command)(原始结果),而不是您之前看到的表,然后该表无法被解析为命令。

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