Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

Пробелы в командной строке Bash

Алексей Дмитриев, 23 сентября 2009

Если аргумент какой-либо команды содержит пробелы (или знаки табуляции) то Bash интерпретирует их как множественные аргументы. Вот, например, команда echo:

$ echo Аргумент содержит пробелы

Аргумент содержит пробелы

Но ошибкой будет считать, что команда такая "умная", что в точности воспроизводит введенный текст. Это не так:

$ echo Аргумент     содержит    пробелы

Аргумент содержит пробелы

На самом деле команда интерпретирует любое количество пробелов (и знаков табуляции) как один пробел; а пробел как разделитель между аргументами. Так как по умолчанию команда echo печатает стандартный вывод в одну строку, то и результат будет одинаковым с любым количеством пробелов.

Другие команды по умолчанию печатают свой вывод обработки каждого аргумента с новой строки, например команда printf:

$ printf '%s\n' Аргумент содержит    пробелы
Аргумент
содержит
пробелы

Тут уж сразу видно, что команда обрабатывала не фразу, а каждое слово как отдельный аргумент.

Как же заставить команду включить пробелы (и знаки табуляции) в свой стандартный вывод? Тут возможны два пути:

1. Маскировка при помощи обратного слэша (\). По-английски называется Escaping, а управляющие символы, начинающиеся с обратного слэша, Escapе-символами (само слово "escapе" переводится как исчезать, скрываться). Вот пример маскировки пробела:

$ echo Аргумент\ \ \ \  содержит\ \ \ \  пробелы

Аргумент     содержит     пробелы

$ printf '%s\n' Аргумент\ \ \ содержит\ \ \ пробелы

Аргумент   содержит   пробелы

Механизм такой маскировки прост: при помощи специального символа, обратного слэша, мы лишили пробела его значения как разделителя между аргументами, и теперь он интерпретируется Bash только как часть текста.

2. Закавычивание. Если заключить аргумент в кавычки, двойные или одинарные, то он всегда будет интерпретирован в качестве единого выражения. Например:

$ echo 'Кавычки    спасают    пробелы'

Кавычки    спасают    пробелы

Такой же механизм работает и с командами, принимающими имена файлов в качестве аргумента. Имена файлов ведь тоже могут содержать пробелы; для примера создадим файл по имени text file и попытаемся просмотреть его при помощи команды cat:

$ cat text file
cat: text: Нет такого файла или каталога
cat: file: Нет такого файла или каталога

Применим маскировку:

$ cat text\ file

You read text file

Или кавычки:

$ cat 'text file'

You read text file

А интересно, справится ли с этой задачей автозавершение?

$ cat te (TAB)   ----->  $ cat text\ file

Автозавершение выбрало вариант маскировки. Это не удивительно, ведь маскировать приходится не только пробелы, но и управляющие символы, с которыми кавычки не справятся.

Пока мы рассматривали только пробелы внутри аргумента команды. Лишние же пробелы перед командой, между командой и опциями, между опцией и аргументом, как правило, игноририруются. Если только иное поведение специально не оговорено в синтаксисе команды.

$        cat -b        text\ file
     1
     2  You read text file

И, наконец, пробел, поставленный вместо аргумента многих команд, заставляет их принимать стандартный ввод. Например:

$ cat -b  (Enter)
Тут и сказке  (Enter) 
конец.  (Enter)(CTRL+d)
     1  Тут и сказке
     2  конец.

Все статьи серии Human