bash
определяет несколько метасимволов . От man bash
:
метасимвол Символ,
который без кавычек разделяет слова. Одно из следующего:
| &; () <> пробел
Поскольку метасимволы разделяют слова, не имеет значения, окружены ли они пробелами. Символ трубы |
, является метасимволом и, следовательно, как вы заметили, ему не нужны пробелы вокруг него.
Следует отметить , что [
, ]
, {
, }
и =
являются не метасимволы. Их значение, напротив, сильно зависит от того, окружены ли они пробелами.
Примеры, когда пробелы есть и не нужны
Как вы заметили, не имеет значения, |
окружены ли пробелы. Давайте рассмотрим некоторые примеры, которые обычно путают пользователей bash. Рассмотреть возможность:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Паренсы выше заставляют date
команду выполняться в подоболочке. Поскольку (
и )
являются метасимволами, пробелы не нужны. В отличие от:
$ {date}
bash: {date}: command not found
Поскольку {
и не}
являются метасимволами, оболочка рассматривается как одно слово. Вместо того, чтобы искать команду, она ищет команду с именем . Поскольку он не находит, возникает ошибка.{date}
date
{date}
Другая распространенная проблема - test
команда. Следующее работает успешно:
$ [ abc ] && echo Yes
Yes
Удалите пробелы и произойдет ошибка:
$ [abc] && echo Yes
bash: [abc]: command not found
Потому [
и ]
являются не метасимволы, лечит оболочки [.bashrc]
как одно слово , и результат, так же , как в date
примере, является ошибкой.
Операторы присваивания также чувствительны к пробелам. Следующее задание выполнено успешно:
$ v=date
$ echo $v
date
Добавьте пробел и назначение завершится неудачно:
$ v= date
Sun Mar 1 12:55:05 PST 2015
В приведенном выше описании оболочка временно устанавливается v
пустой и затем выполняет date
команду.
Добавление пробела перед =
также вызывает сбой, но по другой причине:
$ v =date
bash: v: command not found
Здесь оболочка пытается выполнить команду v
с аргументом =date
. Ошибка в том, что не найдено ни одной команды с именем v
.