10815
Комментарий:
|
10823
|
Удаления помечены так. | Добавления помечены так. |
Строка 3: | Строка 3: |
Перенаправление ввода-вывода. | === Перенаправление ввода-вывода. === |
Основы использования командной строки
Перенаправление ввода-вывода.
Мы уже говорили, что программа когда запускается, то ей сразу передаётся три файловых дескрипотра --- стандартный ввод (0), стандартный вывод (1) и стандартный поток ошибок (2). Открытием этих файлов занимается ОС, прграмма запущенная уже получает их открытыми. Её дело --- читать из 0, выводить 1 и ошибаться в 2. Не её дело открывать их и закрывать. Это очень удобно, потому что по умолчанию все три потока ассоциируются с терминалом. Нпример, прграмма cat довольно бессмысленна сама по себе --- читает из stdin и выводит в stdout. Но если программа, которая её запускает, подсунет ей другие дескрипторы, то оно так и будет, средствами шелла это делается при помощи <, > и >>. В первом случае перенаправление на стандартного потока ввода, во втором и третьем --- стандартного потока вывода в файл.
Для перенаправления stderr надо использовать 2> filename. При этом в последнем примере (запуск script) ничего на экран не попало, всё ушло в файлы.
Ещё более интересным и мнгообещающим является перенаправление stdout однй программы на stdin другой. При этом происходит такая штука: создаётся безымянный pipe, который в ФС отсутствует, но позволяет передавать данные между процессами.
Команда cal выводит календарь на месяц, раскрашивая сегодняшний день, поскольку она определяет, что stdout --- терминал. cal | cat организует перенаправление при помощи безымянного канала, при этом cal определяет, что stdout не терминал и ничего не раскрашивает.
Программа wc выводит количество символов-слов-переводов строк. cal | wc
Можно делать длинные конфейеры: cal | tac | tac , cal | head -2 | tail -1
Эта штука, перенаправление, очень эффективна, и почти любой сценарий этим пользуется.
Всякие способы работы с шеллом.
Шелл --- штука триединая. Тот интерпретатор, с которым мы работаем, выполняет три функции:
- Удобство работы с командной строкой. Например, истроия и tab completion. То есть, интерфейс взаимодействия с пользователем.
- Это оболочка или интегратор. Основное в программном окружении --- утилиты, которые обеспечивают командный интерфейс к ядру. Утилиты сами по семе решают одну очень небольшую задачу по добыче или преобразованию текстововой информации (например, ls добывает, sort преобразует). При этом тот факт, что эти утилиты можно как-то друг к другу приклепать и сделать так, чтбы они работали совместно, то есть построить решение пользовательской задачи --- обеспечивается именно шеллом. Пдобное удобство манипулирования и интегрирования утилит представляет только шелл, поскольку это является его основной задачей.
- Непосредственное построение решения, язык программирования. Это полноценный высокоуровневый язык, объектами которого являются объекты файловой системы.
Что касается второй: мы немного поработали с фалами, обратите внимание, что у нас есть механизм передачи информации от одного прцесса другому. Если мы говоорим, что шелл --- ЯП, то очевидно, что есть переменные. Мы може присвоить переменной значение. Обратите внимание на две вещи: переменные все строковые. Почему --- потому что вычислительные задачи лучше решать на языке, пригодном для выч, и использовать подобные написанные программы, интегрируя их с другими шеллом. Имя переменной инициализируется в первом присваивании, значение переменной --- $имя. Это в общем показало нам шелл как некий извращённый языка программирования, если бы не одна подробнсть --- лектор говорил о том, что текущий каталог вхдоит в окружение процесса, то есть любой процесс в системе имеет в своём контексте тот каталог, который является текущим. На самом деле, в этот контекст входит не только текущий каталог. В окружение входят дескрипторы всех открытых фойлв, идентификатор пользователя, идентификатор группы, и куча других переменных. Но у них какое-то значимое содержимое, каждая что-то значит. Более того, при форке процесса наследуется окружение. Важно, что переменная HOME была определена при логине и все процессы пользователя получ её в наследие. Кроме этго, есть много других переменных --- пользователь, имя шелла... Очень важная переменная PATH содержит список каталогов, в кторых шелл ищет исполнимые файлы, если данное имя команды не является встроенным. В отличие от доса, текущий каталог не используется при поиске программы.
Подстановки.
Чобы дать пример того, насколько мощным интегратором является шелл, лектор расск. ещё об одной вещи, к-роая исп. братите внимание на то, каким образм максим вставлял значние с порбелм. Закавычивание для параметра с пробелами схр. его в тм виде, в ктором он написан внутри каывчек. Если без кавычек, т будет иначе.
...
Вспомните, что когда происх. разбор строки, он делае это по алгоритму. Внутри этого алгоритма есть ещё один процесс --- генерация списк файлов по фаблону. Что это такое? Когда вы хтите соверш. групповую операцию над файлами, то ис.пп специальные символы: * --- любе кол-во символов, ? --- один символ, в кв. скобках диапзон [abc] --- неск. символов, [a-z] --- диапазон, [^a-z] --- исключение диапазона.
Например, echo F*. Кто превратил F* в список файлов? Шелл. Когда шелл видит спецсимвол, то он применяет шаблон к именам файлов. Вопр. знак сотв. ровно одному символу, звёздчка --- лшюбому, в т. .ч нулю. Какие вещи не стоит забывать при исп. FNG: этим занимается шелл, и прграмма ничего об этом не знает. Второе --- файлы с точки не включаются в FNG по умолчанию. При этом .* включит файлы . и .., что не всегда хорошо. Общего решения для этого нет. (.[^.]* ..?*)
Сведения о ресурсах
Готовность (%) |
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
Maintainer |
Start date |
End date |
13 |
1 |
1 |
1 |
|
1 |
|
|