ЭКРАНИРОВАНИЕ ПРОБЕЛОВ В КОМАНДНОЙ СТРОКЕ LINUX
Если аргумент какой-либо команды содержит пробелы (или знаки табуляции) то 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 конец.