Литмир - Электронная Библиотека
Содержание  
A
A

[me@linuxbox ~]$ ls -l Два слова.txt

ls: невозможно получить доступ к 'Два': Нет такого файла или каталога

ls: невозможно получить доступ к 'слова.txt': Нет такого файла или каталога

Добавив двойные кавычки, можно запретить разбиение слов и получить желаемый результат; кроме того, с помощью двойных кавычек мы исправим ошибку:

[me@linuxbox ~]$ ls -l "Два слова.txt"

-rw-rw-r-- 1 me me 18 2012-02-20 13:03 Два слова.txt

[me@linuxbox ~]$ mv "Два слова.txt" Два_слова.txt

Вот так! Теперь не нужно вводить эти противные двойные кавычки.

Запомните: подстановка параметров, подстановка значений арифметических выражений и подстановка команд все еще выполняются в двойных кавычках:

[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)"

me 4   February 2012

Su Mo Tu We Th Fr Sa

          1  2  3  4

5  6  7  8  9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29

Давайте отвлечемся и посмотрим, какой эффект оказывают двойные кавычки на подстановку команд. Сначала рассмотрим действие механизма разбиения на слова. В одном из примеров, приведенных выше, мы видели, как механизм разбиения на слова удаляет дополнительные пробелы из текста:

[me@linuxbox ~]$ echo this is a     test

this is a test

По умолчанию этот механизм находит пробелы, символы табуляции и символы перевода строки и интерпретирует их как разделители слов. То есть вне кавычек упомянутые символы не считаются частью текста. Они являются лишь разделителями. Поскольку они делят слова на аргументы, получается, что в нашем примере командная строка состоит из команды и четырех аргументов. Однако если добавить двойные кавычки, разбиение на слова выполняться не будет и внутренние пробелы не будут считаться разделителями — они станут частью аргумента:

[me@linuxbox ~]$ echo "this is a     test"

this is a     test

После добавления двойных кавычек командная строка будет состоять из команды и одного аргумента.

Тот факт, что символы перевода строки интерпретируются механизмом разбиения на слова как разделители, вызывает интересный и трудноуловимый эффект при подстановке команд. Взгляните:

[me@linuxbox ~]$ echo $(cal)

February 2012 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

[me@linuxbox ~]$ echo "$(cal)"

   February 2012

Su Mo Tu We Th Fr Sa

          1  2  3  4

5  6  7  8  9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29

В первом случае подстановка команд без кавычек привела к созданию командной строки с 38 аргументами, а во втором случае получилась командная строка с одним аргументом, включающим внутренние пробелы и символы перевода строки.

Одиночные кавычки

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

[me@linuxbox ~]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

text /home/me/ls-output.txt a b foo 4 me

[me@linuxbox ~]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"

text ~/*.txt {a,b} foo 4 me

[me@linuxbox ~]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'

text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

Как видите, каждый следующий уровень экранирования все больше и больше подавляет подстановку.

Экранирование символов

Иногда бывает необходимо экранировать только один символ. Для этого достаточно добавить перед символом обратный слеш, который в данном случае называется экранирующим символом (escape character). Часто этот прием используется в двойных кавычках, чтобы выборочно предотвратить подстановку.

[me@linuxbox ~]$ echo "Баланс счета пользователя $USER: \$5.00"

Баланс счета пользователя me: $5.00

Экранирование символов также широко применяется для подавления специального значения символов в именах файлов. Например, в именах файлов допускается использование символов, которые имеют специальное значение для командной оболочки. К их числу относятся: $, !, &, (пробел) и др. Чтобы включить специальный символ в имя файла, его достаточно экранировать, как показано ниже:

[me@linuxbox ~]$ mv bad\&filename good_filename

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

Заключительное замечание

По мере накопления опыта использования командной оболочки мы все чаще будем использовать возможности подстановки и экранирования, поэтому важно хорошо понимать, как они работают. Фактически можно смело утверждать, что эти два механизма являются наиболее важными для изучения аспектами командной оболочки. Без надлежащего понимания того, как действует подстановка, командная оболочка будет оставаться источником непонимания и домыслов, при этом многие ее возможности останутся неиспользованными.

управляющие последовательности

Обратный слеш используется не только в роли экранирующего символа, но и как часть специальных символов, которые называют управляющими кодами (control codes). Первые 32 символа в схеме кодирования ASCII использовались для передачи различных команд в устройствах, таких как телетайп. Некоторые из этих кодов хорошо знакомы вам (табуляция, забой, перевод строки и возврат каретки), тогда как другие — нет (пустой символ, конец передачи и подтверждение), как показано в табл. 7.2.

Таблица 7.2. Управляющие последовательности

Управляющая последовательность

Значение

\a

Звонок («предупреждение» — заставляет компьютер подать звуковой сигнал)

\b

Забой (backspace)

\n

Новая строка (в Unix-подобных системах этот символ выполняет перевод строки)

\r

Возврат каретки

\t

Табуляция

В этой таблице перечислены некоторые наиболее известные управляющие последовательности. Идея использования обратного слеша зародилась в языке программирования C и была заимствована многими другими языками, включая язык командной оболочки. Параметр -e команды echo включает интерпретацию управляющих последовательностей. Их можно также заключать в конструкцию $' '. Ниже демонстрируется использование команды sleep, простой программы, которая всего лишь ждет указанное число секунд и завершается, для создания элементарного таймера.

sleep 10; echo -e "Time's up\a"

То же самое можно выразить так:

sleep 10; echo "Time's up" $'\a'

8. Продвинутые приемы работы с клавиатурой

Я часто шутливо описываю Unix как «операционную систему для тех, кто любит печатать». Казалось бы, сам факт наличия командной строки доказывает это. Но в действительности пользователи командной строки не любят печатать слишком много. Зачем, если есть так много команд с короткими именами, таких как cp, ls, mv и rm?

Фактически одной из самых заветных целей командной строки является уменьшение объема ввода — возможность выполнить большую часть работы всего несколькими нажатиями клавиш. Другая цель — не позволить рукам оторваться от клавиатуры и коснуться мыши. В этой главе мы рассмотрим возможности bash, увеличивающие скорость и эффективность использования клавиатуры.

Здесь будут представлены следующие команды:

• clear — очищает экран.

• history — выводит содержимое истории команд.

Редактирование командной строки

19
{"b":"568756","o":1}