Занятие 4. Shell Что такое Shell? Интерпретируемый язык программирования Подстановка команд Конвейеры Выполнение команд Средства настройки среды Ядро Аппаратура Shell Назначение переменных ОС Shell Перенаправление ввода/вывода Генерация имен файлов Подстановка переменных Пользователи Автоматическое завершение имен файлов $ more fra <Tab> $ more frankenstein <Return> …….. $ more abc <Tab> $ more abcdef <Tab> 1)abcdefXlmnop 2)abcdefYlmnop $ more abcdef затем X или Y, после чего нажмите <Tab>. Соответствующее имя файла будет автоматически завершено shell'ом Автоматическое завершение имен файлов(2) $ cd tr <Tab> do <Tab> r <Tab> $ cd tree/dog.breads/retriiver Буферирование команд •Shell сохраняет команды, которые вводит пользователь в файле предыстории $HOME/.bash_history •Команда history выводит на экран последние командs • Ранее введенные команды можно вызвать повторно, отредактировать и запустить вновь (клавишами вверх вниз) Среда пользователя •Среда пользователя описывает сеанс работы с системой для программ, которые он запускает. Синтаксис: env Пример: $ env НОМЕ=/home/gerry EDITOR=vi TERM=70092 … PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin:\ /home/gerry/bin Среда пользователя(2) Среда пользователя содержит следующую информацию: •Маршрутное имя начального каталога пользователя •Куда посылать электронную почту пользователя •Часовой пояс, в котором работает пользователь •Где shell будет искать команды Среда пользователя(3) Перечень наиболее общих переменных среды и их смысловое содержание TERM, COLUMNS и LINES используемого Описывают параметры терминала HOME каталога Маршрутное имя начального PATH Путь поиска команд LOGNAME задаваемое Входное имя пользователя, при входе в систему Некоторые из этих переменных устанавливаются для каждого пользователя самой системой, другие устанавливаются явно в /etc/profile или .profile. Установка переменных shell'a •Переменная shell'a имеет имя, которому ставится в соответствие некоторое значение. •Значение переменной может быть изменено. • Некоторые переменные shell'a определяются в процессе входа пользователя в систему. •Пользователь может определить новые переменные shell'a. Синтаксис: name=value Пример: $ PATH=/usr/bin/Xll:/usr/bin Что происходит при входе в систему? 1. getty •выводит содержимое файла /etc/issue •выдает приглашение login: •запускает процесс login 2. login •определяет допустимость введенного имени пользователя и пароля •помещает пользователя в начальный каталог •запускает shell пользователя 3. shell •выполняет /etc/ profile или /etc/csh.login •выполняет . profile или . login, находящиеся в пользовательском каталоге •выполняет .bashrc если файл создан пользователем и его имя присвоено переменной ENV в файле .profile •запускает пользовательский shell Внутренние команды shell и UNIX команды Внутренние команды встроены в shell: set, while, if, for Команды UNIX находятся в /usr/bin: cd ls more file Система находит команды UNIX, используя переменную PATH. Поиск команд - команда whereis Синтаксис: whereis [-b|-m|-s] команда Просматривает список каталогов для поиска указанной команды Примеры: $ whereis if if : $ $ whereis ls ls: /sbin/ls /usr/bin/ls /usr/share/man/man1.Z/ls.1 $ $ whereis cd cd: /usr/bin/cd /usr/share/man/man1.Z/cd.1 $ $ whereis holdyourhorses holdyourhorses : Поиск команд - команда whereis(2) Опции -b поиск только по двоичным кодам -m поиск по описаниям команды -s поиск по исходным текстам Shell-подстановки •Подстановка переменных •Подстановка команд •Тильда-подстановка Подстановки используются для увеличения скорости ввода и выполнения командных строк. Shell: хранение переменных Локальные переменные color=blue count=3 dir_name=/home/user3/tree Программный код /usr/bin/sh Переменные среды PS1=$ PATH=/usr/bin:/usr/contrib/bin HOME=/home/user3 TERM=70094a SHELL=/usr/bin/sh Shell: вывод на экран всех переменных, содержащихся в данный момент в среде $ env MANPATH=/usr/share/man:/usr/contrib/man:/usr/local/man PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/local/bin LOGNAME=user3 ERASE=^H SHELL=/usr/bin/sh HOME=/home/user3 TERM=hpterm PWD=/home/user3 TZ=PST8PDT EDITOR=/usr/bin/vi Shell: установка значений переменных Синтаксис: переменная=значение Пример: $ color=lavender переменной $ count=3 переменной Установка локальной Установка локальной $ dir_name=tree/car.models/ford переменной Установка локальной $ PS1=hi_there$ среды Изменение переменной Подстановка переменных Синтаксис: $переменная подстановку Указывает shell’у выполнить переменной Пример: $ echo PATH$ /usr/bin:/usr/contrib/bin:/usr/local/bin $PATH=$PATH:$HOME:. $ echo PATH$ /usr/bin:/usr/contrib/bin:/usr/local/bin:/home/user3:. $echo $HOME /home/user3 $ file_name=$HOME/file1 $ more $file_name <contents of /home/user3/file1> Использование фигурных скобок ({}) •Пусть есть две переменные с именами file и file1. Этим переменным могут быть присвоены значения с помощью следующих операторов: $ file=this $ file1=that $ echo $fileand$file1 ищет переменные fileand и file1 sh: fileand: parameter not set $ echo ${file}and$filel thisandthat ищет переменные file и file1 Фигурные скобки могут использоваться для выделения имени переменной из окружающего текста. Подстановка переменных(2) $ dir_name=tree/car.models/ford $ echo $dir_name tree/car.models/ford $ ls -F $dir_name sedan/ sports/ $ my_ls="ls -aFC" $ $my_ls ./ file.1 tree/ ../ file.2 $ $my_ls $dir_name . / .. / sedan/ sports/ $ cd /tmp $ dir_name=/home/user2/tree/dog.breeds/retriever $ $my_ls $dir_name ./ ../ golden labrador mixed Использование абсолютного маршрутного имени в качестве значения переменной, которая представляет собой имя файла или каталога, позволяет пользователю вне зависимости от местонахождения в файловой системе, получать доступ к файлу или каталогу Подстановка команд Синтаксис: $(команда) Пример: $pwd /home/user2 $curdir=$(pwd) $echo $curdir /home/user2 $cd /tmp $pwd /tmp $cd $curdir $pwd /home/user2 $curdir2=`pwd` $echo $curdir /home/user2 Указывает shell’у выполнить подстановку команды Тильда-подстановки Если слово начинается со знака "тильда" (~), то для этого слова формируется расширение. Следует заметить, тильда — подстановка выполняется только если знак (~) указывается в начале слова, а в случае /~home/users тильда—подстановка не осуществляется. Тильда—подстановки выполняются в соответствии со следующими правилами: •Отдельный знак (~) или предшествующий знаку (/) заменяется на значение переменной HOME. •Тильда с последующим знаком +, заменяется на значение переменной PWD. Переменная PWD устанавливается командой cd при переходе в новый текущий каталог. •Тильда с последующим знаком —, заменяется на значение переменной OLDPWD. Переменная OLDPWD устанавливается командой cd для предыдущего рабочего каталога •Если за знаком тильда следуют несколько символов, а затем символ /, то shell пытается установить не являются ли эти символы именем пользователя в системе. Если это так, то последовательность символов заменяется маршрутным именем начального каталога пользователя. Символ ~ может быть помещен в псевдоним команды. Тильда-подстановки -пример $ echo $HOME /home/user3 $ echo ~ /home/user3 $ echo $PWD /home/user3/tree $ ls ~+/poodle /home/user3/tree/poodle $ echo $OLDPWD /home/user3/mail $ ls ~/home/user3/mail/from.mike /home/user3/mail/from.jim $ echo ~tricia/file1 /home/tricia/file1 Вывод значений переменных env команда /usr/bin/env Вывод значений переменной среды. Это системы UNIX из каталога Вывод на экран всех определенных к данному времени переменных (локальных и переменных среды), а также их значений. Это команда shell. unset Удаление значения переменной. Это команда shell. set Вывод значений переменных-пример $ echo $HOME /home/user3 $ env HOME=/home/user3 PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin SHELL=/usr/bin/sh $ set HOME=/home/user3 PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin SHELL=/usr/bin/sh color=lavender count=3 dir_name=/home/user3/tree $ unset dir_name Экспортирование локальных переменных в среду Синтаксис: export [переменная[=значение]] Экспортирование переменной в среду Пример: $ color=lavender $ export color $ export count=3 $ export export PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/local/bin export color=lavender export count=3 Это встроенная команда shell. Передача переменных в приложение Процесс - выполняющаяся программа. При вводе пользователем имени приложения (или команды) в ответ на приглашение shell, создается порожденный процесс, который исполняется по шагам: 1. fork - порождает параллельный процесс, который дублирует shell-процесс пользователя, включая код программы и области локальных данных и данных среды. 2. exec - заменяет кодовый сегмент и область локальных данных порожденного процесса на программный код и область локальных данных требуемого приложения., затем выполняет процесс затребованного приложения, возвращает управление родительскому процессу. Существует один путь передачи данных порожденным процессам - через среду. Наблюдение за процессами ps [-f] выводит на экран информацию о выполняемых (или ожидающих) процессах в системе Выдает: UID идентификатор владельца процесса PID идентификатор процесса PPID идентификатор родителя процесса STIME начальное время процесса TTY идентификатор терминала, с которого запущен процесс TIME совокупное время выполнения процесса COMMAND команда,соответствующая данному процессу exec команда замещение текущего процесса (это встроенная команда shell). Наблюдение за процессами $ ps -f UID PID PPID user3 4702 1 user3 4895 4702 С 1 18 STIME TTY TIME COMMAND 08:46:40 ttyp4 0:00 -sh 09:55:10 ttyp4 0:00 ps -f C 0 1 18 STIME TTY TIME COMMAND 08:46:40 ttyp4 0:00 -sh 09:57:20 ttyp4 0:00 ksh 09:57:26 ttyp4 0:00 ps -f C 0 18 STIME TTY TIME COMMAND 08:46:40 ttyp4 0:00 -sh 09:57:26 ttyp4 0:00 ps -f $ ksh $ ps -f UID PID user3 4702 user3 4896 user3 4898 PPID 1 4702 4896 $ exec ps -f UID PID user3 4702 user3 4897 PPID 1 4702 Порожденные процессы и среда •Порожденные процессы не могут изменить среду родительских процессов. Пример: $ export color=lavender $ ksh (создание порожденного процесса $ ps -f UID PID PPID С STIME TTY user3 4702 1 0 08:46:40 ttyp4 user3 4896 4702 1 09:57:20 ttyp4 user3 4898 4896 18 09:57:26 ttyp4 $ echo $color lavender $ color=red $ echo $color red $ exit (выход из порожденного процесса shell) $ ps -f (возвра г в родительский процесс) UID PID PPID С STIME TTY user3 4702 1 0 08:46:40 ttyp4 user3 4895 4702 1 09:58:20 ttyp4 $ echo $color lavender shell) TIME 0:00 0:00 0:00 COMMAND -sh ksh ps -f TIME 0:00 0:00 COMMAND -sh ps -f Генерация имен файлов (расширение имен файлов):введение • Символы генерации имен файлов интерпретируются shell`ом • Shell будет генерировать имена удовлетворяющие заданному шаблону • Генерация имен файлов выполнением команды • Команда будет оперировать именами файлов осуществляется со файлов, перед сгенерированными Символы генерации имен файлов ? Соответствует любому одному символу за исключением лидирующей точки [] Определяет группу символов Определяет группу символов, принадлежащих заданному диапазону ! Отвергает заданную группу символов * Соответствует произвольному числу символов, в том числе и нулевому, исключая лидирующую точку Генерация имен файлов и файлы с точкой •Символы генерации имен файлов никогда не породят имя файла, начинающееся с точки •В файлах, чьи имена начинаются с точки, она должна быть всегда указана явно Генерация имен файлов:символ ? ? за Соответствует любому одному символу исключением лидирующей точки Примеры $ ls -a …. .zz abc abcd abcdef abcz bbabb cyz zzayy $ echo ??? Результат: abc cyz $ echo abc? Результат: abcd abcz $ echo ??a?? Результат: bbabb zzayy $ echo .?? Результат: .zz $ echo ? Результат: ? Генерация имен файлов:символы [ ] [] которой Определяет группу символов, из может подойти лишь один Примеры $ ls -a …. .zz 1G 2G 7G 15G Ant Cat Dog abc abcdef ba cyz $ echo [abc]?? Результат: abc cyz $ echo [1-9][A-Z] Результат: 1G 2G 7G $ echo [!A-Z]?? Результат: 15G abc cyz Генерация имен файлов:символ * * Соответствует произвольному числу символов, в том числе и нулевому, исключая лидирующую точку Примеры $ ls -a …. .profile ab.dat abcd.dat abcde abcde.dat $ echo * Результат: ab.dat abcd.dat abcde abcde.dat $ echo .* Результат: .profile $ echo *.dat Результат: abcd.dat abcde.dat $ echo *e Результат: abcde Использование кавычек:введение • Ряд символов имеет «специальный» смысл для shell`а: - пробел - возврат каретки -$ -# -* - <> • «Закавычивание» позволяет отменить особый смысл специальных символов. Символы закавычивания Обратный слэш \ ‘ Одиночные кавычки Двойные кавычки “ «Закавычивание»: символ \ \ Отменяет специальный смысл непосредственно следующего за ним символа Пример: $ echo the \$ text the $text $ color=red\ white\ and\ blue $ echo the value of \$color is $color the value of $color is red white and blue $ echo one two \ >three four one two three four «Закавычивание»: символ ‘ ‘ Отменяет специальный смысл всех символов, заключенных между одиночными кавычками Пример: $ color=‘red white and blue’ $ echo ‘the value of \$color is $color’ the value of \$color is $color $ echo ‘the value of $color is’ $color the value of $color is red white and blue «Закавычивание»: символ “ “ Отменяет специальный смысл всех символов, заключенных между двойными кавычками, за исключением \, $, {имя переменной}, $(команда) и “ Пример: $ color=“red white and blue” $ echo “the value of \$color is $color” the value of $color is red white and blue $ cur_dir=“$LOGNAME - your current directory is $(pwd)” $ echo $cur_dir user3 - your current directory is /home/user3/tree $ echo “they’re all here, \\, ‘, \” “ they’re all here, \, ‘, “