странное поведение подоболочки, выполняющей команду с аргументами - PullRequest
0 голосов
/ 18 марта 2019

когда я выполняю следующую команду напрямую:

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», как если бы она была отдельной командой при отправке в подоболочке?

1 Ответ

4 голосов
/ 18 марта 2019

Это не 1, это часть аргументов, которые интерпретируются bash, это вывод команды.

Во-первых, вы должны знать, что mysql имеет два режима вывода по умолчанию: таблица и raw . Первый используется, когда выходной поток команды является терминалом и печатает понятный человеку вывод. Второй используется иначе и печатает вывод, легко управляемый скриптами. Вы можете принудительно использовать один или другой, используя параметры, чью документацию я связал.

Во-вторых, вам нужно знать разницу между простыми (subshell) и $(command substitution): в обоих случаях команда запускается в подоболочке, но при подстановке команды вывод команды подставляется в исходную командную строку, которая затем выполняется.

Итак, что произошло, когда вы написали $(mysql command), так это то, что его вывод был 1 (необработанный результат) вместо таблицы, которую вы ранее видели, которую затем не удалось проанализировать как команду.

Разницу между подоболочкой и подстановкой команд можно увидеть проще, проверив разницу между (echo 1) и $(echo 1), вторая из которых завершится сбоем точно так же, как ваша текущая команда.

...