Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если система не поддерживает команду ps x, воспользуйтесь опцией -e, которая предназначена для получения списка всех системных процессов:
$ ps -e | grep psl
30004 ? 00:04:01 sh ./psl
3.4.2. Одновременный запуск нескольких заданий
Если необходимо одновременно выполнить несколько команд, можно объединить их в файле сценария, а затем запустить его с помощью команды nohup. Предположим, имеется следующая цепочка команд:
cat /home/acccmnts/qtr_04 99 | /apps/bm/trials.awk | sort | lp
Поместим ее в файл:
$ cat > quarterend
cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp <CTRL‑D>
Сделаем файл исполняемым:
$ chmod 744 quarterend
Теперь запустим этот файл в фоновом режиме посредством команды nohup, направив результаты работы сценария в файл qtr.out.
$ nohup ./quarterend > qtr.out 2>&l &
[5] 182
Обратите внимание на то, что при вызове файла quarterend указано путевое имя '. /.' Тем самым интерпретатору shell дается указание искать данную команду в текущем каталоге.
3.5. Заключение
Мы рассмотрели различные способы выполнения заданий в фоновом режиме. Необходимость в этом может возникнуть при пакетном обновлении больших файлов или выполнении сложной операции поиска. Подобную работу лучше не делать в часы пиковой загрузки системы.
Можно создать сценарии, которые автоматически модифицируют журнальные файлы. Вам останется лишь просматривать эти файлы по мере необходимости. Таким образом, программа cron и другие представленные в этой главе команды позволяют существенно упростить администрирование системы.
ГЛАВА 4
Подстановка имен файлов
При работе в режиме командной строки довольно много времени уходит на поиск необходимых файлов. Интерпретатор shell предлагает набор метасимволов, позволяющих находить файлы, имена которых соответствуют предложенному шаблону.
Вот список основных метасимволов:
* Соответствует произвольной строке, содержащей ноль и более символов
? Соответствует любому символу
[…] Соответствует любому символу из числа заключенных в скобки
[!…] Соответствует любому символу за исключением тех, которые указаны в скобках
Когда интерпретатор shell встречает указанные символы в командной строке, он обрабатывает их особым образом, если только вы не защитили их с помощью кавычек, о чем говорится в главе 15.
4.1. Применение метасимвола '*'
Символ звездочки может служить заменой любой части имени файла. Следующая команда выводит список всех файлов, имена которых начинаются со строки "app":
$ ls app*
appdva app_tapes
appdva_SLA
Вот как можно получить список файлов, имеющих расширение doc:
$ ls *.doc
accounts.doc qtr_end.doc
Представленная ниже команда находит файлы, у которых имя начинается со строки "cl", а расширение равно sed:
$ ls cl*.sed
cleanlogs.sed cleanmeup.sed
cleanmessages.sed
Звездочку удобно применять, когда, например, не хочется вводить полное имя каталога при переходе в него:
$ cd /etc
$ ls -l | grep ^d
drwxr‑xr‑x 2 root root 1024 Jan 26 14:41 cron.daily
drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.hourly
drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.monthly
drwxr‑xr‑x 2 root root 1024 Jan 26 14:37 cron.weekly
$ cd cron.w* S pwd
/etc/cron.weekly
4.2. Применение метасимвола '?'
Знак вопроса служит для замены любого отдельного символа. Следующая команда выводит список файлов, имена которых содержат не менее трех символов, причем третьим является символ 'R':
$ ls ??R*
BAREAD
Следующая команда ищет файлы с именами, начинающимися со строки "conf", за которой следуют два произвольных символа и расширение log:
$ ls conf??.log .
confl2.log conf.2.log
conf25.log
Вот как можно найти файлы, имена которых состоят не менее чем из четырех символов, причем первым является символ 'f', а последним — 's':
$ ls f??*s
ftpaccess ftphosts ftpconversions ftpusers ftpgroups
4.3. Применение метасимволов […] и [!…]
Метасимволы [… ] соответствуют любому символу из числа тех, что указаны в квадратных скобках. Представленная ниже команда выводит список файлов, имена которых начинаются с символа 'i' или 'o':
$ ls [io]*
inetd.conf ioctl.save outputrc
info‑dir inputrc
initrunlvl issue
inittab issue.net
В скобках можно задавать диапазон символов. Начальный и конечный символы при этом разделяются дефисом. Например, следующая команда ищет файлы с именем log, в расширении которых первый символ — цифра:
$ ls log.[0-9]*
log.0323 log.0325 log.0324 log.0326
Метасимволы [!…] соответствуют любому символу из числа тех, что не указаны
в квадратных скобках. Если в предыдущем примере на первом месте в скобках поставить восклицательный знак, команда будет искать файлы с именами log, в расширении которых первый символ не является цифрой: '
$ ls log.[!0-9]*
log.sybase
Приведенная ниже команда ищет файлы, имена которых начинаются со строки "LPS", два следующих символа могут быть произвольными, затем идет символ, не являющийся цифрой, а за ним — произвольная строка:
$ ls LPS??[!0-9]*
LPSILP LPSOSI LPSOPS LPSPOPQTR
Поиск файлов, имена которых начинаются с символа верхнего регистра, производится посредством такой команды:
$ ls [A‑Z]*
Следующая команда ищет файлы, имена которых, наоборот, начинаются с символа нижнего регистра:
$ 1а [а–z]*
А эта команда находит файлы, в начале имени которых стоит цифра:
$ ls [0-9]*
Вот как можно найти все скрытые файлы (такие как .profile, .rhosts, .history и т. д.):
$ ls .*
4.4. Заключение
Метасимволы представляют собой универсальный инструмент поиска строк по шаблону. С их помощью легко находить нужные файлы и каталоги. Далее мы более подробно рассмотрим способы применения метасимволов в составе регулярных выражений.
ГЛАВА 5
Ввод и вывод данных в интерпретаторе shell
Команды и сценарии могут получать входные данные двумя способами: из стандартного входного потока (связан с клавиатурой) или из файла. Аналогичное разделение существует и при выводе данных: результаты работы команды или сценария по умолчанию направляются на экран терминала, но можно перенаправить их в файл. Если в процессе работы возникают ошибки, сообщения о них тоже отображаются на экране. Чтобы избежать этого, нужно перенаправить поток ошибок в файл.
В этой главе рассматриваются следующие темы:
• работа со стандартными потоками ввода, вывода и ошибок;
• переадресация ввода и вывода.
5.1. Команда echo
Команда echo отображает на экране указанную строку текста. Общий ее формат таков:
echo строка
В строке могут встречаться различные управляющие символы, ниже перечислены основные из них: c запрет отображения концевого символа новой строки f прогон страницы n новая строка t горизонтальная табуляция
Например, если указать управляющий символ с, то по завершении вывода не будет осуществлен переход в новую строку:
$ echo "Как вас зовут?tc"
Как вас зовут? $
Здесь $ -cимвол приглашения.
По умолчанию подразумевается, что в конце строки находится символ новой строки: