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
.