Что такое командный интерпретатор и хочу ли я использовать какой-либо другой?
Командный интерпретатор (оболочка) – это программа, которая интерпретирует всё, что вы печетаете в командной строке и решает, что с этим делать. Командный интерпретатор также может быть запущен в неинтерактивном режиме, например, для выполнения предварительно напечатанного списка команд из текстового файла (сценария, скрипта). Командный интерпретатор можно считать эквивалентом ДОС’овского файла “command.com”, а сценарий командного интерпретатора эквивалентом файлов пакетной обработки (*.bat) ДОС. По сравнению с ДОС’овскими родственниками командный интерпретатор операционной системы LINUX и язык сценариев (скриптов) гораздо мощнее.
Как настроить приглашение в моей оболочке?
На моей машине приглашение может выглядеть следующим образом:
[stan@marie stan]$ _
где “stan” – имя, под которым я вхожу в систему, “marie” – имя компьютера, второе слово “stan” – название текущего рабочего каталога, и “_” представляет курсор.
Приглашение устанавливается переменной окружения PS1. Для того, чтобы отобразить текущую настройку, я могу использовать команду:
echo $PS1
Общесистемные настройки приглашения (настройки для всех пользователей в системе) находятся в файле /etc/bashrc, который в моей системе содержит следующую строку:
PS1=”[\u@\h \W]\$ ”
Для настройки приглашения я могу отредактировать файл /etc/bashrc (как суперпользователь) и вставить практически любой текст внутри кавычек. Вот значение некоторых специальных кодов, которые я могу захотеть использовать:
\u - имя текущего пользователя(= $LOGNAME),
\h - имя компьютера, на котором запущена оболочка (hostname),
\H - полное имя компьютера,
\W - название текущего каталога,
\w - полное имя текущего каталога,
\$ - выдавать “$” для нормальных пользователей и “#” -для суперпользователя,
\! - номер текущей команды в истории команд,
\# - номер текущей команды (по отношению к выполненным в текущей оболочке),
\d - текущая дата,
\t - текущее время (24-х часовой формат),
\T - текущее время (12-ти часовой формат) – справедливо только для bash версии 2.0,
\@ - текущее время (AM/PM формат) – только для bash 2.0,
\s - название оболочки,
\a - звуковой сигнал (beep),
\j - число запущенных заданий пользователя,
\n - новая строка,
\\ - забой (backslash),
\[ - начало последовательности непечатаемых символов,
\] - конец последовательности непечатаемых символов,
\nnn - символ ASCII, соответствующий восьмеричному числу nnn.
$(date) – вывод команды date (или любой другой, если она указана таким же образом),
Вот – пример как добавить цвет. Для более детальной информации смотри следующую главу:
PS1=”\[\033[1;32m\][\u@\h \W]\$\[\033[0m\] ”
Есть также приглашение второго уровня, устанавливаемое переменной PS2. Командный интерпретатор использует его в случае, когда ожидается дополнительный ввод данных. В моей системе вторичное приглашение – “> “. Я не слишком волнуюсь о PS2, но если бы я волновался, то мог бы установить её тем же способом, что и PS1. Есть даже PS3 и PS4, но они редко встречаются.
Как написать простой сценарий (скрипт)?
Создайте текстовый (ASCII) файл, в котором будет содержаться ваш скрипт. Например, я обычно использую текстовый редактор pico для написания сценария, который запускает программу tar со всеми параметрами, обычно необходимыми для распаковки “тарболов”, загруженных из Internet (Я ,кажется, никогда не запомню все опции tar). Я решил назвать мой скрипт “untar”:
pico untar
Поскольку файл с именем “untar” не существовал в моём текущем каталоге, он был создан с помощью текстового редактора pico. Теперь я печатаю содержание моего скрипта:
#!/bin/bash
echo this is the script file $0
echo untarring the file $1
# теперь вызываем tar с флагами -xvzf (extract,
# verbose, filter through gzip, input filename)
tar -xvzf $1
Сохраняю файл с помощью комбинации клавиш <Ctrl>o и выхожу с помощью <Ctrl>x
Первая строка сценария, начинающаяся с “#!” (называемая решётка-восклицательный знак) является особой — она указывает командному интерпретатору, какую программу следует использовать для интепретации моего скрипта. В данном примере скрипт нужно интерпретировать оболочкой bash /bin/bash . Первая строка должна начинаться с #! , иначе скрипт никогда не будет запущен (файл будет интерпретироваться как текстовый). Другие строки, начинающиеся с # являются комментариями для автора (читателей, пользователей) и полностью игнорируются интерпретатором.
$0, $1, $2 … в моём сценарии являются параметрами, передаваемыми скрипту. Например, если бы я запустил скрипт с названием “myscript” с семью параметрами следующим образом:
myscript a b c d e f g
тогда переменная $0 была бы видна внутри сценария “myscript” как имеющая значение “myscript”, $1 имела бы значение “a”, $2 была бы “b”, $3 была бы “c”, и так далее.
Во второй и третьей строках моего скрипта команда echo распечатывает на экране всё, что следует за ней на той же строке, “разворачивая” $0 и $1 в значения параметров, переданных скрипту. Четвёртая и пятая строки содержат комментарии, которые я написал для того, чтобы напомнить себе, чего я пытаюсь достичь на всякий случай – если я буду должен модифицировать сценарий.Последняя строка выполняет нужную работу.
Как только скрипт написан, я делаю файл исполняемым для его владельца (”u”=user):
chmod u+x untar
и мой сценарий готов для запуска следующим образом:
./untar my_tar.tar.gz
Язык скриптов в Linux действительно богат, гибок, мощен и может быть сложным. Однако, не требуется специальных знаний при написании сценариев для автомацизации простых задач. Вы просто соединяете группу часто используемых команд, одну за другой, внутри файла. Я использую язык скриптов, поскольку я слишком ленив, чтобы набирать одни и те же группы команд снова и снова.
Действительно простая последовательность команд также может быть напечатана в текстовом файле и передана оболочке на выполнение с помощью команды:
source my_file
[Нет необходимости в начальном сочетании "#!" или права на выполнение.]
Стандартные потоки ввода, вывода и ошибок
Имеют дискрипторы (номера)
Стандартный ввод - 0
Стандартный вывод – 1
Стандартный поток ошибок и сообщений – 2
Переназначение стандартных потоков
| команда > файл | Вывод в файл |
| команда >> файл | Вывод в конец файла |
| команда > файл 2>&1 | Вывод команды и ошибки в файл |
| команда < файл | Ввод данных из файла |
| команда < файл > файл | Ввод данных из файла1 вывод в файл2 |
| команда <<РАЗДЕЛИТЕЛЬ | Получает данные из входного потока, пока не встретится РАЗДЕЛИТЕЛЬь |
$cat /etc/passwd/ | sort > pas.txt отсортированный список пользователей записывается в файл pas.txt
$cat > myfile создает пустой файл myfile
mail user < content.txt отправляет пользователю user сообщения записанное в файле content.txt
$cat >myfile <<ПОКА
> Привет! Я пишу тебе письмо
> Пока!
> ПОКА
$ cat myfile
Привет! Я пишу тебе письмо
Пока!
$cat myfile 2>err.err сообщения и ошибки пишутся в файл myfile
Стандартный вход и стандартный выход
Большинство команд LINUX получают свои входные данные от клавиатуры терминала и посылают результаты обратно на экран терминала. Команда обыкновенно читает входные данные со стандартного входа, которым по умолчанию является ваш терминал. Результаты своего выполнения команда также направляет по умолчанию на стандартный выход, которым опять-таки является терминал, с которого вы зарегистрировались в системе.
Давайте в качестве примера возьмем одну действительную команду. Пусть такой командой будет who, которая выводит на терминал список всех пользователей, работающих в настоящий момент с системой. Результат работы этой команды показан на рис. 3.6

Если выполнить команду sort без аргумента (имя файла), то команда будет принимать входные данные с клавиатуры терминала, предполагая его в качестве стандартного входа.
Когда вводится информация для данной команды с терминала, клавиши Ctrl и D необходимо нажать одновременно, после того как введен последний символ данных. Это указывает команде, что ввод закончен и ей пора начинать работу. В качестве примера возьмем несколько имен в произвольном порядке, так, как они будут вводиться с клавиатуры, и подадим их на вход sort:
$ sort
mama
wasko
papa
kinder
urka
Ctrl-d
kinder
mama
papa
urka
wasko
$
Так как мы не указали имя файла в команде, входные данные были взяты со стандартного входа – терминала. После одновременного нажатия клавиш Ctrl-d, символизирующих окончание ввода, команда sort выполнила сортировку по алфавиту и вывела результат своей работы на стандартный выход, в нашем случае опять-таки терминал. Это показано на рис.3.7.

Переназначение выхода
В системе LINUX результаты работы любой команды, в принципе предназначенные для стандартного выхода, легко могут быть перенаправлены в другое устройство или записаны в файл (а файл, как вы помните, в UJNIX логически ничем не отличается от устройства).
Например, предположим, что вы хотите запомнить список пользователей как результат действия команды who в некоем файле. Для этого нужно прибавить к команде выражение >filename, и результат будет записи в файл с желаемым именем, а на экране вы уже ничего не увидите:
$ who > userlist
$
Чтобы посмотреть, какие же все-таки были у нас пользователи, можно применить команду cat:
$ cat userlist
inter pts000 Oct 6 16841
root console Oct 6 16:42
•ttymon3 tp/12 Oct 6 17:12
informix pts002 Oct 6 17:10
$
Команда echo, бессмысленная на первый взгляд, но которая, как мы потом увидим, широко используется в Shell-программировании, также поймает результат к стандартному выходу, что означает возможность его переназначения:
$ echo line 1 > file1
$ cat file1
line 1
$
Если нужно добавить к сохраненному файлу filel еще пару строк, то нужно выполнить следующее:
$ echo line 2 >> filel
$ cat filel
line 1
line 2
$
$ echo line 3 >>filel
$ cat filel
line 1
line 2
line 3
$
В этом примере используется комбинация символов >>, которая используется для добавления информации в конец файла. Предыдущее его содержание не теряется, а новая информация просто добавляется к первоначальной. ,
Переназначение входа
Так же, как выходные данные могут быть перенаправлены в файл, входные данные могут быть взяты из файла. И поскольку знак (>) используется для переназначения выхода, точно таким же образом, знак (<) используется для переназначения входа. Разумеется, вход из файла может быть назначен для тех команд, которые в принципе получают данные со стандартного входа.
Чтобы переназначить вход данной команды, вводится знак (<) перед именем файла, из которого необходимо получить данные.
Так, например, чтобы подсчитать число строк в файле userlist, можно, как известно, использовать команду we -l userlist:
$ we -1 userlist
4 userlist
Или, чтобы подсчитать число строк в том же самом файле, можно использовать форму записи команды с переназначенным входом:
$ we -l < userlist
4
Заметим, что существует разница в результате этих двух форм записи команды для исполнения. В первом случае заодно с числом строк записывается и имя файла, а во втором – нет. Это показывает очень тонкую разницу между исполнением двух различных вариантов одной и той же команды. В первом случае we знает, что получает входные данные из файла usrerlist. Во втором случае команда знает только то, что получает данные со стандартного входа. Командная оболочка (Shell) перенаправляет входные данные от терминала к файлу userlist. Что до самой команды we, то та не знает откуда идут входные данные – со стандартного входа или из файла.
Переназначение входа и выхода
Как вы, вероятно, уже догадались, и вход и выход одной команды могут быть переназначены одновременно, если, разумеется, в режиме по умолчанию команда принимает данные со стандартного входа и отправляет результаты своего выполнения на стандартный выход:
$ cat userlist
inter pts000 Oct б 16:41
root console Oct 6 16:42
•ttyinon3 tp/12 Oct 6 17:12
Informix pts002 Oct 6 17:10
$ sort < userlist >sort_userlist
$ cat sort_userlist
Informix pts002 Oct 6′17:10
inter pts000 Oct 6 16:41
root console Oct 6 16:42
ttymon3 tp/12 Oct 6 17:12
$
В этом примере входные данные команды sort бьши переназначены на файл userlist, а результат – на файл sort_userlist.
Для перенаправления стандартного потока ошибок следует использовать конструкцию “2>”. Например:
dir my_dir 2> errorlisting.txt
Вышеприведённая команда пошлёт стандартный вывод на дисплей и ничего непошлёт в файл, если команда dir не сгенерирует ошибку. При ошибке ничего не будет послано на дисплей, а файл errorlisting.txt будет содержать сообщение от ошибке, которое будет выглядеть примерно так:
dir: my_dir: Permission denied
Кроме перенаправления в обычные файлы и фильтры (как показано в вышеприведённых примерах) можно совершать перенаправление в/из устройств и специальных файлов. Далее приводятся некоторые примеры.
Пример перенаправления в файл устройства. Следующая команда отображает список файлов на четвёртом текстовом терминале:
dir > /dev/tty4
Конвейеры
Несомненно, что для тех, кто уже успел поработать с MS DOS, знакомы понятия “конвейер” и “фильтр”. Само собой разумеется, что эти славные понятия ни в коей мере нельзя поставить в заслугу MS DOS, потому что она без зазрения совести позаимствовала их у LINUX. Тем не менее, сравнительно редко встречаются пользователи, которые активно применяют эти средства в MS DOS, может быть по причине ее примитивного командного языка. В то же время это одно из наиболее изящных средств в LINUX.
Конвейер служит для назначения стандартного выхода одной программы в качестве стандартного входа для другой. Конвейер и переназначение ввода/вывода – явления разные. Если при переназначении ввода или вывода информация соответственно читается или пишется в файл, то конвейер непосредственно соединяет “трубопроводом” выход одной программы со входом другой. Конвейер обозначается с помощью символа (|).
Конструкция
Command1 arg… | command2 arg…
означает, что стандартный выход команды command1 направлен на стандартный вход команды command2.
В конвейер можно соединять несколько команд. При этом стандартный файл вывода любой команды, кроме последней, служит стандартным файлом ввода следующей команды в конвейере. Каждая команда в системе выполняется как отдельный процесс, соединенный с соседним процессом программным каналом pipe.
Чем хороша в принципе идея конвейера? Она хороша тем, что позволяет с помощью очень простых базовых средств операционной системы реализовать идею модульного программирования, когда вместо больших и сложных программ можно создавать небольшие программные модули и связывать их посредством конвейеров любым желаемым способом, используя при этом богатые возможности процедурного языка Shell, которые мы опишем позднее.
Графически этот процесс изображен на рис. 3.8.

Заметим, что когда между двумя командами установлен конвейер, то стандартный выход первой команды непосредственно присоединен к стандартному входу второй команды, и поэтому вы уже не увидите на экране результат действия команды cat, так как он перенаправлен в команду 1рг, что можно видеть на рис. 3.9.

Приведем еще примеры конвейеров с несколькими командами,. используемыми одновременно.
Представим, что вы хотите получить список подкаталогов в вашем текущем каталоге и вдобавок отсортировать их по алфавиту.
Во-первых, как получить подкаталоги?
Если выполнить обычную команду
$ ls -l
то в желаемый список будут включены и обычные файлы, которые содержатся в текущем каталоге. С помощью команды grep можно отфильтровать нежелательную информацию. В конвейере grep может быть использована следующим образом:
$ ls -l | grep ‘^d’
В этой строке по конвейеру вывод команды ls передается в команду grep. Шаблон для фильтровки здесь заключен в кавычки, потому что в него входит ^d – специальный символ Shell. Выражение ‘^d’ соответствует всем строкам, начинающимся с буквы “d”, и следовательно, в список войдут только каталоги, так как строки каталогов при выводе на печать по команде ls с ключом -1 всегда начинаются с буквы “d” (directory). Что касается команды sort, то ее просто надо добавить в конвейер, чтобы отсортировать найденные строки (рис.3.10).

Мы подчеркивали факт, что все результаты команд, которые перенаправляются к входам других команд, не появляются на экране терминала. Иногда, однако, может потребоваться записать результат работы некоей промежуточной команды в конвейере. Для этих целей существует команда tee. Формат этой команды очень прост:
tee file
Команда tee просто записывает данные, которые идут со стандартного входа и направляются к стандартному выходу, в файл. Рис. 3.12 поможет вам легче понять функцию команды и происхождение ее имени (Т-образная форма).

Так, например, чтобы сохранить распечатку полноформатных имен каталогов в файле listdir, нужно использовать конструкцию вида
$ ls -1 | grep ‘^d” | tee listdir | wc -1

Команду tee можно, разумеется, добавить и в конец конвейера и таким образом записать результаты, одновременно просматривая их на экране.
Ввод нескольких команд в одной строке
Можно спокойно вводить несколько команд в одной командной строке, отделяя их друг от друга точкой с запятой. Например:
$ date; pwd
Wed Oct 21 12!45:15 EST 1994
/home/inter
$
Продолжение длинной команды на следующей строке
Иногда требуется ввести команду, которая занимает больше одной строки. Для этой цели используется обратная наклонная черта в конце строки и продолжение команды на следующей строке. Клавиша Return, как и обычно, используется для завершения ввода. Нельзя нажимать клавишу Return сразу после обратной наклонной черты. Приведем пример использования:
$ echo one\
> two\
>three
one two three
$
Отметим, что символ подсказки изменяется при этом со знака (S) на знак (>) в двух строках, где команда продолжается. Таким способом система LINUX показывает, что ожидает завершения ввода команды. В момент, когда по Return завершается некоторая строка без обратной наклонной черты, LINUX понимает это как конец ввода и начинает выполнять введенную команду.
Порядок выполнения команд
- Оператор &&
команда1 && команда2
Правая (вторая) команда выполняется только тогда, когда результат левой ( первой ) команды ИСТИНА
- Оператор ||
команда1 || команда2
Правая (вторая) команда выполняется только тогда, когда результат левой ( первой ) команды ЛОЖЬ
Примечание: Всегда результат ИСТИНА это 0
ЛОЖЬ это 1
Символы-шаблоны и символы – замещения
Символы-шаблоны и символы замещения, иначе еще называемые к метасимволами, используются в LINUX обычно при генерации имен файлов
Обычно управление процессом генерации имен в LINUX обеспечивается с помощью следующих метасимволов:
* соответствует любой последовательности символов;
? соответствует любому символу;
- означает некий диапазон символов.
[ открывает группу символов;
] закрывает группу символов;
[…] — любой символ из числа тех, что находятся в скобках . Можно задавать интервалом
Например : [279] – или 2 или 7 или 9
[a-zA-Z] - только буквы английского алфавита
[!…] – любой символ из числа тех, что не находятся в скобках . Можно задавать интервалом
Например : [!279] – не 2 не 7 и не 9
[a-zA-Z] - не буквы английского алфавита
Примеры:
$ ls *.c Распечатает все файлы с расширением “.с”.
$ ls b* Распечатает все файлы, начинающиеся с буквы “b”.
$ ls ??.c Распечатает все файлы с двухбуквенным именем до расширения (например, ab.c, или 12.с, или Iz.c и т. д.).
$ ls pic[0-9] Распечатает все файлы, у которых имя состоит из nepвых трех букв “pie” и любой цифры.
$ ls pic[3-8] Распечатает все файлы, у которых имя состоит из первых трех букв “pie” и цифры, в диапазоне 3-8.
$ ls pic[0-15] Распечатает все файлы, у которых имя состоит из первых трех букв “pie” и цифры 0, 1 или 5.
Иногда требуется отменить назначение метасимвола, если он, к примеру, встречается в имени файла. Для этого нужно взять его в кавычки Если в текущем каталоге существуют два файла с именами “whos?” “whosi”, то по команде
$ ls whos?
будет напечатан список из имен обоих файлов, тогда как команда
$ ls “whos?”
вызовет печать информации только о файле “whos?”. Аналогично по кoманде
$ Is whos\?
напечатается та же информация.
Фильтрация текста
| Метасимволы | Описание |
| ^
$ [..] [^..] точка) * |
Начало строкиКонец строки Любой символ указанный в скобках. Можно интервал, например [1-9] или [a-z] Любой символ не указанный в скобках. Можно интервал, например [^1-9] или [^a-z] Любой отдельный символ Ноль или более символов |
Например “log.n” -> login, logon, logan …
^comp -> computer, compiler …
Команда фильтрации
grep – выполняет поиск в текстовых файлах или стандартном входе выражений соответствующих шаблону и выводит результат в стандартный поток вывода
Синтаксис : grep [параметры] регулярное _выражение [файл]
Параметры : -с — число строк удовлетворяющих условию
-n – нумерует строки
$grep -c “48” data.f — количество строк где встречается “48”
$grep ‘48[34]’ data.f –выбрать строки где встречаются 483 или 484
$grep ‘^[^48]’ data.f – строки не начинающиеся с 4 или 8
Извлечь из каталога имена подкаталогов
ls –l | greep ’^d’
Похожие записи
No user прокомментировали сообщение
Оставить комментарий