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