Глава1. Оболочка общие сведения.
В процессе загрузки операционных систем семейства Linux, после загрузки ядра системы выполняется переход в интерактивный режим – режим взаимодействия пользователя и операционной системы. В ОС Linux, первым запускаемым в ходе загрузки процессом, является программа инициализации init, которая определяет перечень и характеристики терминалов, имеющихся в системе, и вызывает программу интерактивного входа getty, отображающую приглашение для ввода имени пользователя. После ввода имени пользователя и пароля, программа getty вызывает программу login, которая проверяет достоверность учетной записи, выполняет переход в домашний каталог пользователя и передает управление программе начального запуска сеанса, в качестве которой обычно используется программа оболочки пользователя, конкретная разновидность которой определяется содержимым файла /etc/passwd для данной учетной записи.Командная оболочка (shell) обеспечивает взаимодействие между пользователем и средой операционной системы Linux. Она является специализированным программным продуктом, который обеспечивает выполнение команд и получения результатов их выполнения, или, если совсем уж упрощенно, оболочка – это программа, которая предназначена для обеспечения выполнения других программ по желанию пользователя. Примером оболочки может быть, например, интерпретатор команд command.com операционной системы MS DOS, или оболочка bash операционных систем Unix / Linux. Оболочка Bash представляет средства для написания сценариев оболочки.
Оболочка читает свой ввод ....
Оболочка разбивает входные данные на токены:
слова и операторы.
Оболочка анализирует ввод в простые и составные
команды.
Оболочка выполняет различные расширения (отдельно) …
Оболочка выполняет перенаправление и удаляет
операторы перенаправления и их операнды из
списка параметров.
Оболочка выполняет функцию, встроенный,
исполняемый файл или скрипт …
Оболочка по желанию ожидает завершения
команды и собирает статус выхода.
1.1 Краткий обзор функциональных средства.
В оболочке Bash предоставляются следующие функциональные средства и возможности
Переадресация ввода-вывода.
Применение метасимволов для сокращения имен файлов. Переменные и параметры для специальной настройки рабочей среды. Встроенный набор команд для написания программ оболочки. Функции и оболочки для модульной организации задач.
Управление заданиями.
Редактирование (редакторы vi ,Emacs).
Доступ к предыдущим командам.
Арифметические операции.
Массивы и арифметические выражения.
Применение псевдонимов и другие средства.
1.2 Вызов оболочки.
Интерпретатор команд оболочки можно вызвать
bash [параметры ][аргументы ]
Путь к оболочке по ссылке /bin/sh.
Команды оболочки можно выполнять с терминала, из файла (когда в качестве первого аргумента указан сценарий).Исходные оболочки читают содержимое файлов etc/profile и . profile profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), …).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ];
Примечание
$ echo $PS1-
${debian_chroot:+($debian_chroot)}\u@\h:\w\$ -
$ echo $BASH-
/bin/bash-
$ echo $BASH
/bin/bash
then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
Следующий фрагмент кода определяет форму приглашения для root # для user $
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
Следующий фрагмент кода запускает один за другим всескрипты в каталоге /etc/profile.d
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Глава 2 Синтаксис.
2.1.Специальные файлы.
Оболочка читает содержимое одного или нескольких файлов запуска.
/etc/profile Автоматически при входе в систему
~/.bash_profile, ~/.bash_login или ~/.profile
~/.bashrc
~/.bash_logout Выход из системы или команда exit,
2.2 Метасимволы подстановки имен файлов.
* Совпадение с любой строкой.
Пример, перечислить файлы начинающие с output
$ ls output*
output1.wav output2.wav output3.wav output4.wav
? Совпадение с любым символом.
Пример
$ cd video?
~/video1$
[ abc..] совпадение с любым символом в квадратных скобках.
[!abc..] совпадение с любым символом кроме указанных в квадратных скобках.
~ Начальный каталог текущего пльзователя
~max Начальный каталог пользователя max
~+Текущий рабочий каталог ($PWD)
~– Предыдущий рабочий каталог ($OLDPWD).
Пример
~/video1$ cd # Переходим в текущий каталог.
$ cd – # Переходим из текущего каталога в предыдущий.
~/video1$
2.3.Метасимволы при установленном параметре extglob.
Активизировать расширение шаблонов командой
shopt (манипулирование параметрами оболочки).
shopt: shopt [-pqsu] [-o] [параметр …]
Set and unset shell options.
Options:
–o restrict OPTNAMEs to those defined for use
with `set -o'
–p print each shell option with an indication
of its status
–q suppress output (запретить выход).
–s enable (set) each OPTNAME
–u disable (unset) each OPTNAME
$shopt -s extglob
$ man shopt
Нет справочной страницы для shopt
?(шаблон) Совпадение с нулевым или единичным
количеством экземпляров заданного шаблона.
*(шаблон) Совпадение с нулевым или большим
количеством экземпляров заданного шаблона.
+(шаблон)Совпадение с единичным или большим
количеством экземпляров заданного шаблона.
@(шаблон) Точное совпадение с одним экземпляром
заданного шаблона.
! (шаблон) Совпадение с любыми символьными
строками не совпадающими с заданным шаблоном
Пример 1 Создадим файл из одной строки
$ cat >fs2.txt
Hello
^d
$ rm fs?(2).txt; cat fs2.txt
cat: fs2.txt: Нет такого файла или каталога
Пример 2
$ cat >fs01.txt
Allo
$ rm fs*(01).txt; cat fs01.txt
cat: fs01.txt: Нет такого файла или каталога
Пример 3
$ cat >fs_lin.txt
Hello friend
$ rm fs@(_lin).txt; cat fs_lin.txt
cat: fs_lin.txt: Нет такого файла или каталога
Пример 4
$ cat >fs_lin.txt
Hello friend
$ rm fs!(lin).txt; cat fs_lin.txt
rm: невозможно удалить 'fs!(lin).txt': Нет такого файла или каталога
cat: fs_lin.txt: Нет такого файла или каталога
2.4 Совпадение с классами символов.
Класс Совпадающие символы
alnum Буквенно-цифровые
alpha Буквенные
ascii Символы в коде ACII
blank Пробелы и знаки табуляции
cntrl Управляющие
digit Десятичные цифры
graph Непробельные
lower Строчные буквы
print Печатаемые
punct Знаки препинания
space Пробельные
upper Прописные буквы
word То же что и alnum
xdigit Шестнадцатиричные цифры
Пример
Эквивалентом выражения "[a-zA-Z_0-9]" является выражение "[[:alnum:]]"
Выражению "[0-9]" эквивалентно выражение "[[:digit:]]"
Выражению "[a-Z]" эквивалентно регулярное выражение "[[:alpha:]
[01[:alpha:]%] совпадает с 0 ,1 ,любым алфавитным символом или %.
2.5 Раскрытие скобок.
Раскрытие скобок выполняется прежде других видов раскрытия выражений, {} не должны заключаться в кавычки. Подстановка команд при раскрытии скобок игнорируется оболочкой BASH.
Пример 1
$ echo hi{BBB,AAA}there
hiBBBthere,hiAAAthere
Пример2
$ echo a{d,c,b}e
ade ace abe
Пример 3
$ echo 1 to 5 is {1..5}
1 to 5 is 1 2 3 4 5
$ echo 1 to 8 by 2 {1..8}
1 to 8 by 2 1 2 3 4 5 6 7 8
Использование скобок ( ) показано на следующем примере – выполнение группы команд.
$ (date; w;) Результат
Чт 22 июл 2021 08:31:12 MSK
08:31:12 up 3:00, 1 user, load average: 0,02, 0,14, 0,18
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
max tty2 tty2 05:31 2:59m 0.11s 0.10s /usr/libexec/gn
Использование скобок [ ] и (( )) показано на примере простого скрипта.
$ cat >skobki.sh
#!/bin/bash
X=1
while [ $X -lt 5 ]
do
echo "–> $X <–"
X=$(( $X+1 ))
done
exit 0
$ chmod +x skobki.sh
$ ./skobki.sh
–-> 1 <–
–-> 2 <–
–-> 3 <–
–-> 4 <–
2.6 Управляющие последовательности символов.
Распознаются и интерпретируются в следующих контекстах. Символьная строка в форме $ '…'
Аргументы в командах echo -e , printf %b
(Подставить управляющие последовательности символов в символьные строки).
Форматирующие строки, указываемые в команде printf ( управляющие последовательности символов в заданном формате экранируются).
\a Звонок
\b Возврат на 1 позицию
\c Подавить знак новой строки
\e Переход
\E Переход
\f Перевод страницы
\n Перевод строки
\r Возврат каретки
\t Табуляция
\uHHHH Символ HHHH в Юникоде
\nnn Восьмиричное значение nnn
\’ Одиночная кавычка
\” Двойная кавычка
\? Знак вопроса
\\ Обратная косая черта
Простой пример
$ echo -e "Hello Friend"
Hello Friend
$ echo -e "Hello\nFriend"
Hello
Friend
$ echo -e "Hello Friend" \?
Hello Friend ?
2.7 Формы команд.
–Выполнить команду в фоновом режиме $ cmd &.
–Выполнить команды группой в текущей оболочке {cmd1; cmd2}.
Пример 1
$ { who;pwd; }
max tty7 2019-08-12 05:17 (:0)
/home/max
–Выполнить команды в подоболочке (cmd1 ;cmd2)
Пример 2
$ (date; who; pwd) > logfile
$ cat logfile
Сб авг 3 09:03:21 MSK 2019
max tty7 2019-08-03 08:23 (:0)
/home/max
–Передать выход cmd1 на вход cmd2. $ cmd1 | cmd2
Пример 3, найти все файлы с расширением .sh и
сделать их исполняемыми
$ find *.sh -type f |xargs chmod +x
Проверка
$ ls -l *.sh
–Результат команды cmd2 как аргумент cmd1.
$ cmd1 `cmd2`
$ cat `pwd`
cat: /home/max: Это каталог
–Подстановка команд сmd1 $(cmd2)
Пример 4, создадим файл с датой
$ touch f01 $(date)
$ ls -l f01
–rw-rw-r– 1 max max 0 авг 3 09:39 f01
Числовой результат в качестве аргумента
cmd $ (выражение)
–Логическое И. $ cmd1 && cmd2
–Логическое ИЛИ $ cmd1 || cmd2
–Логическое НЕ $!cmd
Пример 5
$ date || touch f81.txt; ls f81.txt
Сб 30 мая 2020 06:43:33 MSK
ls: невозможно получить доступ к 'f81.txt': Нет такого файла или каталога
$ date && touch f81.txt; ls f81.txt
Сб 30 мая 2020 06:43:54 MSK
f81.txt
2.8 Простая переадресация ввода-вывода.
Ниже отображены формы переадресации ввода-вывода
cmd>file Направить результат команды в файл.
Пример 1
$ date >f30.txt; cat f30.txt
Вт июн 11 22:10:14 MSK 2019
cmd>> file Добавить результат команды в файл
Пример 2
$ date >>f30.txt; cat f30.txt
Вт июн 11 22:10:14 MSK 2019
Вт июн 11 22:11:45 MSK 2019
cmd <file Взять входные данные для команды из
файла.
Пример 3
$ cat <f30.txt
Вт июн 11 22:10:14 MSK 2019
Вт июн 11 22:11:45 MSK 2019
Пример 4 Встраиваемая строка.
Представить текст заданного слова в качестве входных данных для указанной команды.
$ cat <<<"Privet"
Privet
Пример 5
cmd <>file Записать в файл результат команды,
содержимое файла не нарушается.
$ date <> f30.txt; cat f30.txt
Вт июн 11 21:58:17 MSK 2019
Вт июн 11 17:15:49 MSK 2019
cmd >| file Направить результат команды в файл
переписав его содержимое.
Пример 5 Направить результаты в файл, переписав его содержимое.
$ date
Пн 12 июл 2021 08:02:24 MSK
$ cat >f30.txt
Hello
$ date >| f30.txt
$ cat f30.txt
Пн 12 июл 2021 08:03:13 MSK
2.9 Переадресация ввода-вывода с использованием дескрипторов файлов.
Файловый дескриптор – целое число,которое указывает доступ к файлу.
Стандартный ввод stdin дескриптор 0.
Стандартный вывод stdout дескриптор 1.
Стандартный вывод ошибок stderr дескриптор 2. Клавиатура stdin файл.
Экран stdout файл. Файловый дескриптор привязан к индефикатору процесса.
Пример
# sleep 1000 &
[2] 5021
# cd /proc/5021/fd ; ls
0 1 2
cmd >&n Направить результат команды в файл с
дескриптором n.
Пример 1 # дескриптор 1 стандартный вывод.
$ date >&1
Вт июн 11 22:05:51 MSK 2019
cmd >&– Закрыть стандартный вывод
$ date >&-
date: ошибка записи: Неправильный дескриптор файла.
cmd<&n Взять входные данные для указанной команды из файла с заданным дескриптором n.
$ cat >file1<&0
privet
$ cat file1
privet
cmdm<&n Входные данные из файла с дескриптором m
поступают из файла с дескриптором n.
$ cat >file1 2<&0
privet 4 # Набираем с клавиатуры
$ cat file1
privet 4
cmd<&– Закрыть стандартный ввод.
$ pwd<&-
/home/max1
$
cmd<&n Направить содержимое файла с заданным дескриптором n в стандартный ввод,получив сначала копию, а затем закрыв оригинал.
cmd>&n- Направить содержимое файла с заданным дескриптором n в стандартный вывод,получив сначала копию,а затем закрыв оригинал.
Пример Напишем следующий скрипт
$ cat f2.sh
#!/bin/sh
read str <&0
echo "$str" | festival –tts –language russian
Запускаем скрипт
$ sh f2.sh Набираем в терминале фразу
Привет друзья. Нажимаем Enter и слышим
«Привет друзья»
Пример 2
$ cat f5.txt
Hello my friend
$ read str <f5.txt |echo "$str" >&1-
Hello my friend
Использование команды exec с дескрипторами.
exec 0
Создадим под root myfile с двумя командами.
# cat >myfile
pwd; date
Выполнить команды из файла вместо стандартного ввода.
# exec 0<myfile
# pwd; date
/root
exec 1
cat myscript1.sh
#!/bin/sh
exec 1>outfile
0echo "This a test"
$ cat ./outfile
This is a test
exec 3
$ cat myscript3.sh
#!/bin/sh
exec 3> myfile
echo "Privet" >&3
cat ./myfile
$sh myscript.sh
Privet
Примечание возможно использование команды exec c дескрипторами 0-9.
2.10 Многократная переадресация ввода-вывода.
Направить стандартный вывод ошибок в заданный
файл cmd 2>file Пример 1
$ ls -l /root/ 2>ls_er; cat ls_er
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Направить стандартный вывод ошибок и данных в
заданный файл.
cmd >file 2>&1 Пример 2
$ ls -l f1.txt; ls -l /root/ 2>&1 >ls1
–rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt
ls: невозможно открыть каталог '/root/': Отказано в доступе.
$ cat ls1
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Присоединить стандартный вывод данных и
ошибок к содержимому данного файла
cmd&>> file Пример 3
$ ls -l f1.txt; ls -l /root/ &>> ls2
–rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt
$ ls -l f1.txt; ls -l /root/ &>> ls2
–rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt
max1@hp:~$ cat ls2
ls: невозможно открыть каталог '/root/': Отказано в доступе.
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Направить стандартный данных в заданный file1,
стандартный вывод ошибок в указанный file2
Направить стандартный вывод данных и ошибок в
стандартный вывод, так и в заданные файлы.
сmd 2 >&1 |tee файлы или cmd |& tee файлы
Пример 4
$ pwd; ls -l /root/ 2>&1 |tee ls3
/home/max1
ls: невозможно открыть каталог '/root/': Отказано
в доступе.
$ cat ls3
ls: невозможно открыть каталог '/root/':Отказано
в доступе.
2.11 Сохранение дескрипторов файлов в переменных.
Допускается указывать имя переменной вместо
числового обозначения дескриптора.
Пример. Нахождение дескриптора файла.
$ exec 4>file;echo "OK">&4; cat ./file
OK
max@hp:/dev/fd$ ls
0 1 2 255 4
max@hp:/dev/fd$ cat 4
OK
Пример использования дескрипторов числом более 9
$ mv f1.txt f1
$ echo f1 {f1fd}>xyz
f1
$ echo $f1fd
11
$ cd /dev/fd
max@hp:/dev/fd$ ls
0 1 11 2 255 4
max@hp:/dev/fd$ echo "Privet">&11
max@hp:/dev/fd$ cat 11
Privet Дескриптор файла,сохраненный в переменной оболочки может быть использован в сценарии.
2.12 Специальные имена файлов.
/dev/stdin Дубликат дескриптора файла 0
/dev/stdout Дубликат дескриптора файла 1
/dev/stderr Дубликат дескриптора файла 2
/dev/fd/<n> Дубликат дескриптора файла <n>
/dev/tcp/<host>/<port> или /dev/udp/<host>/<port>
Оболочка Bash устанавливает соединение с указанным хостом через заданный порт, используя полученный в итоге дескриптор файла при переадресации ввода-вывода.
~/Документы$ find -print >filelist 2>no_access
Обнаруживаемые файлы направляются в файл filelist, а сообщения об ошибках в файл no_access
Проверка
~/Документы$ cat filelist
.
./Posix1.doc
./script
./script/sc01.sh
./no_access # новый файл
./rus2.doc
./filelist # новый файл
./otchet.doc
Глава 3.Функции.
Функция совокупность команд, выполняемых в
сценарии оболочки.
Синтаксис функции – имя (){ код-тело функции
} [ виды переадресации]
Обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции – ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" – код возврата.
Функции вызываются таким же образом, как и
команды. Если используется ключевое слово function,то указывать () после имен необязательно
Пример создания простой функции с именем privet.
$ if [ "$USER"=max ]; then
> privet ( ) {
> echo "Privet Max";}
> fi
Запускаем функцию
На этой странице вы можете прочитать онлайн книгу «BASH. Справочное пособие», автора Вячеслава Вячеславовича Ткачева. Данная книга имеет возрастное ограничение 16+, относится к жанру «Компьютерная справочная литература». Произведение затрагивает такие темы, как «справочная информация», «самиздат». Книга «BASH. Справочное пособие» была написана в 2022 и издана в 2022 году. Приятного чтения!
О проекте
О подписке