Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

# Что произойдет, если в функцию передать несовместимые единицы измерения,

#+ например "acres" (акры) and "miles" (мили)?

exit 0

m4

Не команда, а клад, m4– - это мощный фильтр обработки макроопределений [ 37 ] , фактически -- целый язык программирования. Изначально создававшаяся как препроцессор для RatFor, m4 оказалась очень полезной и как самостоятельная утилита. Фактически, m4 сочетает в себе функциональные возможности eval, tr, awk, и дополнительно

предоставляет обширные возможности по созданию новых макроопределений.

37

макроопределение -- это идентификатор, символическая константа, которая представляет некоторую последовательность команд, операций и параметров.

В апрельском выпуске, за 2002 год, журнала Linux Journal вы найдете замечательную статью, описывающую возможности утилиты m4.

Пример 12-45. Пример работы с m4

#!/bin/bash

# m4.sh: Демонстрация некоторых возможносией макропроцессора m4

# Строки

string=abcdA01

echo "len($string)" | m4 # 7

echo "substr($string,4)" | m4 # A01

echo "regexp($string,[0-1][0-1],\&Z)" | m4 # 01Z

# Арифметика

echo "incr(22)" | m4 # 23

echo "eval(99 / 3)" | m4 # 33

exit 0

doexec

Команда doexec предоставляет возможность передачи произвольного списка аргументов внешней программе. В частности, передавая argv[0] (для сценариев соответствует специальной переменной $0), можно вызвать программу под другим именем, определяя тем самым, ее реакцию.

Например, Пусть в каталоге /usr/local/bin имеется программа с именем "aaa", которая при вызове doexec /usr/local/bin/aaa list выведет список всех файлов в текущем каталоге, имена которых начинаются с символа "a", а при вызове той же самой программы как doexec /usr/local/bin/aaa delete , она удалит эти файлы.

Естественно, реакция программы на свое собственное имя должна быть реализована в коде программы, для сценария на языке командной оболочки это может выглядеть примерно так:

case `basename $0` in

"name1" ) реакция на вызов под именем name1;;

"name2" ) реакция на вызов под именем name2;;

"name3" ) реакция на вызов под именем name3;;

* ) действия по-умолчанию;;

esac

Глава 13. Команды системного администрирования

Примеры использования большинства этих команд вы найдете в сценариях начальной загрузки и остановки системы, в каталогах /etc/rc.d. Они, обычно, вызываются пользователем root и используются для администрирования системы или восстановления файловой системы. Эти команды должны использоваться с большой осторожностью, так как некоторые из них могут разрушить систему, при неправильном использовании.

Пользователи и группы

users

Выведет список всех зарегистрировавшихся пользователей. Она, до некоторой степени, является эквивалентом команды who -q.

groups

Выводит список групп, в состав которых входит текущий пользователь. Эта команда соответствует внутренней переменной $GROUPS, но выводит названия групп, а не их числовые идентификаторы.

bash$ groups

bozita cdrom cdwriter audio xgrp

bash$ echo $GROUPS

501

chown, chgrp

Команда chown

изменяет владельца файла или файлов. Эта команда полезна в случаях, когда root хочет передать монопольное право на файл от одного пользователя другому. Обычный пользователь не в состоянии изменить владельца файла, за исключением своих собственных файлов.

root# chown bozo *.txt

Команда chgrp изменяет группу, которой принадлежит файл или файлы. Чтобы изменить группу, вы должны быть владельцем файла (при этом должны входить в состав указываемой группы) или привилегированным пользователем (root).

chgrp --recursive dunderheads *.data

# Группа "dunderheads" станет владельцем всех файлов "*.data"

#+ во всех подкаталогах текущей директории ($PWD) (благодаря ключу "--recursive").

useradd, userdel

Команда useradd добавляет учетную запись нового пользователя в систему и создает домашний каталог для данного пользователя. Противоположная, по смыслу, команда userdel удаляет учетную запись пользователя из системы [ 38 ] и удалит соответствующие файлы.

Команда adduser является синонимом для useradd и, как правило, является обычной символической ссылкой на useradd.

38

Команда userdel завершится неудачей, если удаляемый пользователь в этот момент работает с системой

id

Команда id выводит идентификатор пользователя (реальный и эффективный) и идентификаторы групп, в состав которых входит пользователь. По сути -- выводит содержимое переменных $UID, $EUID и $GROUPS.

bash$ id

uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)

bash$ echo $UID

501

См. также Пример 9-5.

who

Выводит список пользователей, работающих в настоящий момент в системе.

bash$ who

bozo tty1 Apr 27 17:45

bozo pts/0 Apr 27 17:46

bozo pts/1 Apr 27 17:47

bozo pts/2 Apr 27 17:49

С ключом -m -- выводит информацию только о текущем пользователе. Если число аргументов, передаваемых команде, равно двум, то это эквивалентно вызову who -m, например who am i или who The Man.

bash$ who -m

localhost.localdomain!bozo pts/2 Apr 27 17:49

whoami– - похожа на who -m, но выводит только имя пользователя.

bash$ whoami

bozo

w

Выводит информацию о системе, список пользователей, подключенных к системе и процессы, связанные с пользователями. Это расширенная версия команды who. Вывод от команды w может быть передан по конвейеру команде grep, с целью поиска требуемого пользователя и/или процесса.

Поделиться с друзьями: