Различия между версиями 14 и 15
Версия 14 от 2008-07-30 01:05:15
Размер: 11923
Редактор: Allena
Комментарий: 50%
Версия 15 от 2008-07-31 23:04:16
Размер: 15143
Редактор: VsevolodKrishchenko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 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.ti
me
}}}

Например, у утилиты 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

MaximByshevskiKonopko, Allena, VsevolodKrishchenko


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

PspoClasses/080717/04ConsoleBasics (последним исправлял пользователь eSyr 2012-05-27 15:01:26)