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.