Важную роль играет еще одна специальная встроенная команда - set. Она используется для изменения режима работы shell и для присваивания новых значений формальным аргументам. Сразу же отметим, что наивное присваивание
цифра=слово
shell трактует как запуск программы с именем цифра=слово, т. е. оно не позволяет изменить значение формального аргумента.
Команда set записывается в виде
set [опция ...] [аргумент ...]
Из ее опций упомянем следующие:
-a
Экспортировать в окружение все переменные, которым производится присваивание.
-C
Защищать существующие файлы от перезаписи при перенаправлении вывода посредством конструкции ">" (см. выше раздел "Перенаправление ввода/вывода").
+o
Выдать на стандартный вывод текущие опции языка shell в виде команд, которые устанавливают те же значения и которые можно подать ему на вход.
-x
Устанавливает режим трассировки после выполнения всех подстановок в командных строках, но до выполнения они будут выдаваться в стандартный протокол. Опция +x выключает трассировку. Стандарт не специфицирует, будет ли трассироваться команда set +x.
Если в команде set заданы аргументы, они станут новыми значениями $1, $2 и т.д. Типичный пример использования команды set содержится в одном из файлов ОС Linux (/etc/rc.d/rc) выполняемых при загрузке системы (см. листинг 2.29):
argv1="$1" set `/sbin/runlevel` runlevel=$2 previous=$1
Листинг 2.29. Пример использования специальной встроенной команды set. (административная утилита runlevel выдает предыдущий и текущий уровни выполнения системы). (html, txt)
Возможностью, не обязательной с точки зрения стандарта POSIX-2001 (отнесенной к расширению "Мобильность пользователей", UP), но весьма полезной на практике, является механизм синонимов для имен простых команд. Синонимы задаются с помощью обычной встроенной команды alias:
alias [имя[=синоним] ...]
Когда shell выделяет в командной строке слово, расположенное вместо имени простой команды, он проверяет, не является ли оно именем синонима, и при положительном ответе заменяет его значением, заданным командой alias и представляющим собой цепочку символов.
Например, если хочется, чтобы команда ls по умолчанию выдавала информацию о файлах, имена которых начинаются с точки, можно воспользоваться спецификацией для определения синонима:
alias ls="ls -a"
Если подставленный синоним оканчивается пробелом, то анализируется следующее слово командной строки; если и оно оказывается именем синонима, подстановки продолжаются. Например, если синоним для ls задать в виде строки с завершающим пробелом
alias ls="ls -a "
и дополнительно ввести еще одно определение синонима
alias l="-Rl"
то команда, использующая синоним с завершающим пробелом,
ls l
будет раскрыта в строку
ls -a -Rl
и выдаст в длинном формате информацию о всех файлах текущего каталога и его подкаталогов.
Команда alias без аргументов выдает список имеющихся синонимов.