11923
Комментарий: 50%
|
15143
|
Удаления помечены так. | Добавления помечены так. |
Строка 3: | Строка 3: |
=== Для чего нужен шелл? === ##может это наверх куда-нибудь? Шелл выполняет 3 функции: * Предоставляет удобные средства для работы с командной строкой. Например, историю команд и дополнение по tab. * Предоставляет возможность комбинировать и интегрировать различные утилиты. Каждая утилита, сама по себе, обычно решает небольшую задачу, при этом получая данные и выдавая результат в текстовом виде. В такой схеме перенаправление ввода-вывода позволяет реализовать совместную работу нескольких утилит, и, таким образом, решить пользовательскую задачу. Подобное удобство манипулирования утилитами предоставляет только шелл, и именно это является его основной функцией. * И, наконец, шелл --- это полноценный высокоуровневый язык программирования, оперирующий объектами файловой системы. === Переменные === Как в любом языке программирования, в шелле есть перменные. В силу особенностей назначения шелла все переменные в нем являются строковыми. Пример инициализации переменной: {{{ $ VAR="Value Value" $ echo $VAR Value Value }}} Переменные автоматически передаются процессам, запущенным из шелла, в качестве части окружения процесса. Окружение процесса --- это набор достаточно разнообразнй информации, связанный с процессом. Туда входят, например, текущий каталог, дескрипторы открытых файлов, и т. п. При fork окружение практически полностью наследуется. Некоторые переменные, например HOME или PATH определяются при входе пользователя в систему, в так называемом login shell, и от него наследуются всеми процессами, запущенными пользователем. Переменная PATH содержит список каталагов, в которых шелл ищет исполняемые файлы. {{{ $ echo $PATH /home/george/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games }}} Заметим, что в отличие от DOS, текущий каталог в PATH не включен. Обратим внимание на значения переменных, содержащие пробел. Например: {{{ $ echo "$VAR" Value Value $ echo $VAR Value Value }}} При использовании кавычек параметр сохраняется в том виде, в котором указан. Без закавычивания несколько пробелов превращаются в один. |
|
Строка 5: | Строка 48: |
Как уже упоминалось, любая программа имеет доступ к трем инициализированным перед ее запуском файловым дескрипторам: 0 (стандартный поток ввода, stdin), 1 (стандартный поток вывода, stdout) и 2(стандартный поток ошибок, stderr). Подготовкой этих файлов занимаются ОС и иногда запускающий процесс, программа получает уже готовые к использованию дескрипторы. По умолчанию все три дескриптора ассоциируются с терминалом. В качестве наглядной демонстрации удобства подобного подхода рассмотрим утилиту cat. Сама по себе она достаточно бессмысленна --- читает данные из stdin и выводит их в stdout. |
## ">", "<", ">>" и "|" были названы в тексте операторами. В man bash они значаться как metacharacters, а "|" также названо operator (то есть операция, по обычному для языков программирования переводу). Для работы с файлами прикладные программы используют файловые дескрипторы. Как уже упоминалось, любая запущенная программа (процесс операционной системы) имеет доступ к трем инициализированным перед ее запуском файловым дескрипторам. Они имеют следующие назначение, мнемонические обозначение и номер: * стандартный поток ввода stdin имеет номер 0; * стандартный поток вывода stdout имеет номер 1; * стандартный поток для сообщений об ошибках stderr имеет номер 2. # и иногда запускающий процесс Все прочие файловые дескрипторы, создаваемые программой, начинаются с номера 3. Подготовкой стандартных файловых дескрипторов занимаются операционная система, а запущенный процесс просто получает уже готовые к использованию дескрипторы и может сразу их использовать для файлового ввода-вывода. По умолчанию все три дескриптора ассоциируются с терминалом: ввод связан с клавиатурным вводом, а вывод и вывод ошибок выводят на экран. В качестве наглядной демонстрации удобства подобного подхода рассмотрим утилиту {{{cat}}}. Сама по себе она достаточно бессмысленна --- читает данные из stdin и выводит их в stdout. Поэтому, если пользователь при работе с ней наберет на клавиатуре "Hello" и Enter, то именно это слово и будет выведено на экран: |
Строка 13: | Строка 65: |
Но существует возможность при запуске программы изменить файлы, ассоциированные с стандартными потоками. Например, шелл позволяет сделать это при помощи операторов `<` , `>` и `>>`. `<` перенаправляет стандартный потока ввода, `>` --- стандартный потока вывода, затирая старое содержимое аргумента, `>>` перенаправляет стандартный поток вывода, добаввляя его содержимое в конец файла-аргумента. {{{ |
При работе с командной средой существует возможность при запуске каждой программы изменить поведение стандартных потоков, например, связав их с файлами. Например, позволяет сделать это при помощи символов "<" , ">" и ">>", записываемых после параметров команды: * символ "<" перенаправляет стандартный потока вводаж * символ ">" перенаправляет стандартный потока вывода, затирая старое содержимое файла; * символы ">>" перенаправляют стандартный поток вывода, добавляя его содержимое в конец файла-аргумента. Рассмотрим следующие примеры использования перенаправления ввода-вывода в файл. {{{ $ # Здесь пользователь набирает "Hello" на клавиатуре. |
Строка 17: | Строка 75: |
$ cat < File | $ # А здесь выводит созданный файл на экран. $ cat < File1 Hello $ # Здесь пользователь набирает "Hello World" на клавиатуре. $ cat >> File1 Hello World $ # И еще раз выводит созданный файл на экран. $ cat < File1 |
Строка 19: | Строка 84: |
$ cat >> File I love you $ cat < File Hello I love you $ cat > File Hello? $ cat < File Hello? $ cat < File > .FileFile $ cat .FileFile |
Hello World $ # Записываем "Hello?" в файл, затирая старое содержимое. $ echo "Hello?" > File1 $ cat < File1 Hello? $ # Копируем File1 в File2 через перенаправления ввода-вывода $ cat < File1 > File2 $ cat File2 |
Строка 33: | Строка 95: |
Перенаправление стандартного потока ошибок в шелле реализуется конструкцией `2> filename`. Например, у утилиты cat нет ключа --l, и если попытатся вызвать ее с ним, она выведет диагностическое сообщение в стандартный поток ошибок. {{{ $ cat --l < File > .FileFile 2>Error |
Перед символами можно указать номер дескриптора для перенаправления. Таким образом, перенаправление стандартного потока ошибок в файл реализуется конструкцией "2>", например: {{{ $ script -t my_script 2> my_script.time }}} Например, у утилиты cat нет ключа --l, и если попытаться вызвать ее с ним, она выведет диагностическое сообщение в стандартный поток ошибок. {{{ $ cat --l < File1 > File3 2> Error |
Строка 41: | Строка 107: |
Еще более интересным и многообещающим является возможность ассоциирования стандартного потока вывода одной программы с стандартным потоком ввода другой. В шелле это организуется оператором |. Обычно для реализации этой функциональности на системном уровне используются безымянные pipe. Программа cal выводит календарь на месяц. Если с потоком вывода проассоциирован терминал, то cal раскрашивает текущий день. В противном случае выводится просто текст. Например, при вызове `cal | cat` выделения цветом не будет (так как потоком вывода для cal будет безымянный канал). |
Если мы хотим поместить в один файл и сообщения об ошибках, и стандартный вывод программы, то можно использовать конструкцию "&>". Следующая команда поместит в файл File3 сообщение о невозможности прочитать файл {{{/etc/shadow}}} и содержимое файла {{{/etc/passwd}}}. {{{ $ cat /etc/shadow /etc/passwd &> File3 }}} Еще более интересным и многообещающим является возможность ассоциирования стандартного потока вывода одной программы с стандартным потоком ввода другой. В командном интерпретаторе эта операция организуется символом "|" ( для реализации этой функциональности на системном уровне обычно используются безымянные каналы). Программа {{{cal}}} выводит календарь на месяц. Если с потоком вывода проассоциирован терминал, то {{{cal}}} раскрашивает текущий день. В противном случае выводится просто текст. Например, при вызове {{{cal | cat}}} выделения цветом не будет, так как потоком вывода для cal будет безымянный канал. |
Строка 55: | Строка 127: |
Утилита `wc` выводит количество символов/слов/переводов строк в стандартном потоке ввода. | Утилита {{{wc}}} без параметров выводит количество символов, слов и переводов строк в стандартном потоке ввода. |
Строка 72: | Строка 144: |
`cal | head -2 | tail -1` (утилита head выводит заданное количество первых строк ввода, tail --- последних. Комбинируя эти утилиты, можно получить произвольный срез файла по строкам): | Утилита {{{head}}} выводит заданное количество первых строк ввода, {{{tail}}} --- последних. Комбинируя эти утилиты, можно получить произвольный срез файла по строкам): |
Строка 78: | Строка 151: |
Перенаправление --- очень эффективный интрумент, использующийся практически в любом шелл-сценарии. === Для чего нужен шелл? === ##может это наверх куда-нибудь? Шелл выполняет 3 функции: * Предоставляет удобные средства для работы с командной строкой. Например, историю команд и дополнение по tab. * Предоставляет возможность комбинировать и интегрировать различные утилиты. Каждая утилита, сама по себе, обычно решает небольшую задачу, при этом получая данные и выдавая результат в текстовом виде. В такой схеме перенаправление ввода-вывода позволяет реализовать совместную работу нескольких утилит, и, таким образом, решить пользовательскую задачу. Подобное удобство манипулирования утилитами предоставляет только шелл, и именно это является его основной функцией. * И, наконец, шелл --- это полноценный высокоуровневый язык программирования, оперирующий объектами файловой системы. === Переменные === Как в любом языке программирования, в шелле есть перменные. В силу особенностей назначения шелла все переменные в нем являются строковыми. Пример инициализации переменной: {{{ $ VAR="Value Value" $ echo $VAR Value Value }}} Переменные автоматически передаются процессам, запущенным из шелла, в качестве части окружения процесса. Окружение процесса --- это набор достаточно разнообразнй информации, связанный с процессом. Туда входят, например, текущий каталог, дескрипторы открытых файлов, и т. п. При fork окружение практически полностью наследуется. Некоторые переменные, например HOME или PATH определяются при входе пользователя в систему, в так называемом login shell, и от него наследуются всеми процессами, запущенными пользователем. Переменная PATH содержит список каталагов, в которых шелл ищет исполняемые файлы. {{{ $ echo $PATH /home/george/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games }}} Заметим, что в отличие от DOS, текущий каталог в PATH не включен. Обратим внимание на значения переменных, содержащие пробел. Например: {{{ $ echo "$VAR" Value Value $ echo $VAR Value Value }}} При использовании кавычек параметр сохраняется в том виде, в котором указан. Без закавычивания несколько пробелов превращаются в один. |
Перенаправление --- очень эффективный интрумент, использующийся практически в любом сценарии на языке shell. |
Основы использования командной строки
Для чего нужен шелл?
Шелл выполняет 3 функции:
- Предоставляет удобные средства для работы с командной строкой. Например, историю команд и дополнение по tab.
- Предоставляет возможность комбинировать и интегрировать различные утилиты. Каждая утилита, сама по себе, обычно решает небольшую задачу, при этом получая данные и выдавая результат в текстовом виде. В такой схеме перенаправление ввода-вывода позволяет реализовать совместную работу нескольких утилит, и, таким образом, решить пользовательскую задачу. Подобное удобство манипулирования утилитами предоставляет только шелл, и именно это является его основной функцией.
- И, наконец, шелл --- это полноценный высокоуровневый язык программирования, оперирующий объектами файловой системы.
Переменные
Как в любом языке программирования, в шелле есть перменные. В силу особенностей назначения шелла все переменные в нем являются строковыми.
Пример инициализации переменной:
$ VAR="Value Value" $ echo $VAR Value Value
Переменные автоматически передаются процессам, запущенным из шелла, в качестве части окружения процесса. Окружение процесса --- это набор достаточно разнообразнй информации, связанный с процессом. Туда входят, например, текущий каталог, дескрипторы открытых файлов, и т. п. При fork окружение практически полностью наследуется. Некоторые переменные, например HOME или PATH определяются при входе пользователя в систему, в так называемом login shell, и от него наследуются всеми процессами, запущенными пользователем. Переменная PATH содержит список каталагов, в которых шелл ищет исполняемые файлы.
$ echo $PATH /home/george/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games
Заметим, что в отличие от DOS, текущий каталог в PATH не включен.
Обратим внимание на значения переменных, содержащие пробел.
Например:
$ echo "$VAR" Value Value $ echo $VAR Value Value
При использовании кавычек параметр сохраняется в том виде, в котором указан. Без закавычивания несколько пробелов превращаются в один.
Перенаправление ввода вывода
Для работы с файлами прикладные программы используют файловые дескрипторы. Как уже упоминалось, любая запущенная программа (процесс операционной системы) имеет доступ к трем инициализированным перед ее запуском файловым дескрипторам. Они имеют следующие назначение, мнемонические обозначение и номер:
- стандартный поток ввода stdin имеет номер 0;
- стандартный поток вывода stdout имеет номер 1;
- стандартный поток для сообщений об ошибках stderr имеет номер 2.
# и иногда запускающий процесс Все прочие файловые дескрипторы, создаваемые программой, начинаются с номера 3. Подготовкой стандартных файловых дескрипторов занимаются операционная система, а запущенный процесс просто получает уже готовые к использованию дескрипторы и может сразу их использовать для файлового ввода-вывода. По умолчанию все три дескриптора ассоциируются с терминалом: ввод связан с клавиатурным вводом, а вывод и вывод ошибок выводят на экран.
В качестве наглядной демонстрации удобства подобного подхода рассмотрим утилиту cat. Сама по себе она достаточно бессмысленна --- читает данные из stdin и выводит их в stdout. Поэтому, если пользователь при работе с ней наберет на клавиатуре "Hello" и Enter, то именно это слово и будет выведено на экран:
$ cat Hello Hello
При работе с командной средой существует возможность при запуске каждой программы изменить поведение стандартных потоков, например, связав их с файлами. Например, позволяет сделать это при помощи символов "<" , ">" и ">>", записываемых после параметров команды:
символ "<" перенаправляет стандартный потока вводаж
символ ">" перенаправляет стандартный потока вывода, затирая старое содержимое файла;
символы ">>" перенаправляют стандартный поток вывода, добавляя его содержимое в конец файла-аргумента.
Рассмотрим следующие примеры использования перенаправления ввода-вывода в файл.
$ # Здесь пользователь набирает "Hello" на клавиатуре. $ cat >> File Hello $ # А здесь выводит созданный файл на экран. $ cat < File1 Hello $ # Здесь пользователь набирает "Hello World" на клавиатуре. $ cat >> File1 Hello World $ # И еще раз выводит созданный файл на экран. $ cat < File1 Hello Hello World $ # Записываем "Hello?" в файл, затирая старое содержимое. $ echo "Hello?" > File1 $ cat < File1 Hello? $ # Копируем File1 в File2 через перенаправления ввода-вывода $ cat < File1 > File2 $ cat File2 Hello?
Перед символами можно указать номер дескриптора для перенаправления. Таким образом, перенаправление стандартного потока ошибок в файл реализуется конструкцией "2>", например:
$ script -t my_script 2> my_script.time
Например, у утилиты cat нет ключа --l, и если попытаться вызвать ее с ним, она выведет диагностическое сообщение в стандартный поток ошибок.
$ cat --l < File1 > File3 2> Error $ cat Error cat: нераспознанный ключ `--l'
Если мы хотим поместить в один файл и сообщения об ошибках, и стандартный вывод программы, то можно использовать конструкцию "&>". Следующая команда поместит в файл File3 сообщение о невозможности прочитать файл /etc/shadow и содержимое файла /etc/passwd.
$ cat /etc/shadow /etc/passwd &> File3
Еще более интересным и многообещающим является возможность ассоциирования стандартного потока вывода одной программы с стандартным потоком ввода другой. В командном интерпретаторе эта операция организуется символом "|" ( для реализации этой функциональности на системном уровне обычно используются безымянные каналы).
Программа cal выводит календарь на месяц. Если с потоком вывода проассоциирован терминал, то cal раскрашивает текущий день. В противном случае выводится просто текст. Например, при вызове cal | cat выделения цветом не будет, так как потоком вывода для cal будет безымянный канал.
$ cal | cat Июль 2008 Вс Пн Вт Ср Чт Пт Сб 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 30 31
Утилита wc без параметров выводит количество символов, слов и переводов строк в стандартном потоке ввода.
$ cal | wc 8 40 186
Можно делать длинные конвейеры: cal | tac | tac (утилита tac выводит поступившие ей строки в обратном порядке, так что, если применить её два раза, ничего не произойдёт):
$ cal | tac | tac Июль 2008 Вс Пн Вт Ср Чт Пт Сб 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 30 31
Утилита head выводит заданное количество первых строк ввода, tail --- последних. Комбинируя эти утилиты, можно получить произвольный срез файла по строкам):
$ cal | head -2 | tail -1 Вс Пн Вт Ср Чт Пт Сб
Перенаправление --- очень эффективный интрумент, использующийся практически в любом сценарии на языке shell.
Генерация списка файлов по шаблону
Для групповых операций с файлами шелл позволяет использовать регулярные выражения для задания группы файлов. Используется стандартная нотация, поддерживаются диапазоны.
Примеры:
$ echo F* FFFFF FFFile1 FFFile2 File File1 File2 File3 File4 File45
$ echo File?? File45 $ echo File[2-4] File2 File3 File4 $ echo File[^2-4] File1 $ echo File[2-4F*] File2 File3 File4 $ echo File[2-4F]* File2 File3 File4 File45
При использовании генерации имен не следует забывать, что выполняет ее именно шелл, а не вызываемая программа.
Так же надо обратить внимание, что файлы, имя которых начинается с . по умолчанию не включаются в генерируемые списки соответствующие шаблону *, а под .* попадают . и ... {{{$ echo .* . .. .FileFile .FileFileFile }}} Общего удобного решения этой проблемы не существует. В частных случаях можно попробовать воспользоваться исключениями:
$ echo .[^.]* .FileFile .FileFileFile
Сведения о ресурсах
Готовность (%) |
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
Maintainer |
Start date |
End date |
50 |
1 |
1 |
1 |
|
1 |
|
|