Shell

реклама
Занятие 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, \, ‘, “
Скачать