Информация о пользователях:
id, logname, whoami, groups, users, who
Информация о системе:
uname, hostname
ENVIRONMENT
И АТРИБУТЫ БАША
Environment ≈ массив переменных, который наследуется вызываемыми
башем программами. Это не все переменные, а только те, которые унаследовал
сам баш, и те созданные в баше переменные, которым был присвоен признак
"экспортируемых".
Атрибуты баша, или флаги, включают особые режимы функционирования баша.
Устанавливаются командой set (см.).
export
Команда export и используется добавления переменных к environment.
Переменные, созданные в баше, не входят автоматически в
environment (массив переменных, наследуемый запускаемыми
программами). Однако это можно изменить с помощью команды
set (см.).
Экспортировать можно как переменные, так и функции (-f).
В принципе, команда export не нужна, так как вместо нее можно использовать
declare -x.
Чтобы изъять переменную из environment, нужно использовать
export -n var
declare, typeset
typeset -- устаревшее, но разрешенное название declare. Используйте это
название, если хотите обеспечить с совместимоть с Korn shell.
Без аргументов выводит значения всех переменных. Если вызвана таким
образом из скрипта, ведет себя довольно странно: сначала выводит
текст скрипта, предшествующий команде set, затем все переменные, а
затем ≈ текст скрипта, следующий за командой.
Если нет аргументов, но указаны опции, выводит определения переменных,
имеющих такие опции, а именно:
-a -- массивы
-f -- функции
-i -- целые числа
-r -- только для чтения
-x --
экспортируемые
Если есть аргументы, то создаются переменные с указанными опциями или
изменяются опции существующих. Если опция указана со знаком "
+" вместо "-", она удаляется. Переменным попутно можно присвоить значения.
Пример:
declare -irx MAGIC_NUMBER=666
-- создает переменную MAGIC_NUMBER, которую нельзя изменять, которая
всегда будет рассматриваться как целое число и которая автоматически
добавляется к
environment
, как если бы была выполнена команда
export.
Кроме того, переменной присваивается значение.
Экспортировать и делать только для чтения можно не только переменные, но
и функции (-f).
Внутри функций declare создает локальные переменные, аналогично local. В
ksh (и в нек. реализациях sh?), не имеющем команды local, для создания
локальных переменных можно использовать синоним declare typeset.
Опция опция -p показывает атрибуты переменной или всех переменных,
если переменная не указана.
declare -r
выведет что-нибудь вроде:
declare -ri EUID="42"
declare -ri PPID="1"
declare -ri UID="42"
-- однако просто declare выведет переменные без указания их признаков.
Зато:
export -p
работает так, как можно было бы ожидать от declare -p
readonly
Делает переменную или функцию (-f) read only или выводит список таких
переменных (-p) . Аналогичную вещь делает 'declare -r', так что эта
команда лишняя.
unset
Отменяет определение переменной или функции (-f).
set
Опции, переданные set , устанавливают атрибуты самого баша. Если вместо
"-" перед атрибутом идет "+", атрибут сбрасывается. Если есть аргументы,
set присваивает их позиционным параметрам $1, $2 и т. д.
Без опций и аргументов выводит все переменные. Если вызвана таким
образом из скрипта, ведет себя довольно странно, как и команда declare
(см.).
Атрибуты могут задаваться в короткой или длинной форме. В длинной
форме ≈ через опцию -o. Опция -o без параметров выводит значения
всех атрибутов:
set -o
выведет что-нибудь вроде:
allexport on
braceexpand on
emacs on
errexit off
histexpand on
ignoreeof off
interactive-comments on
monitor off
noclobber off
noexec off
noglob off
nohash off
nounset off
physical off
posix off
privileged off
verbose off
vi off
xtrace off
Интересные атрибуты:
emacs (нет короткого названия) -- расширенные возможности
редактирования. В интерактивных шеллах установлена по умолчанию.
vi (нет короткого названия) -- возможности редактирования, аналогичные
viкомандам
vi
a (allexport) -- автоматический экспорт всех переменных
e (errexit) -- прекращать работу, если команда, не входящая в группу,
или группа команд возвратила ненулевое значение. При прекращении работы
не выдается никаких сообщений.
f (noglob) -- запрещает обрабатывать маски (*, ? и т. д.).
h (hashall) -- запоминать пути к выполненным командам (по умолчанию)
n (noexec) -- не выполнять команды, только проверить их правильность
v (verbose) -- аналог echo on в ДОС
x (xtrace) -- расширенный аналог verbose
n (nounset) -- рассматривать использование неопределенной переменной как
ошибку
C (noclobber) -- см. про переменную noclobber
P (physical) -- при смене текущей директории на линк, делать именем
текущей директории не имя линка, а имя физической директории.
"--" -- если за этим ничего не следует, unset позиционные параметры.
ВСТРОЕННЫЕ КОМАНДЫ (SHELL BUILTINS)
команда ":" (двоеточие)
Осуществляет анализ командной строки, но не выполняет ее.
Всегда завершается успешно.
#!/bin/bash
: $[a=2*2]
echo "a=$a"
-- выведет:
a=4
Значение переменной $a было присвоено в результате [[побочного эффекта]]
анализа, выполненного командой ":".
source
или "." (точка)
Выполняет команды из указанного файла в текущем баше, без запуска нового,
как если бы содержимое файла набиралось на клавиатуре. Это позволяет,
в отличие от выполнения скрипта, запомнить изменения в environment,
определения функций и прозвищ. Используя эту команду, в программу
можно включать "библиотечные" функции, определенные в других файлах.
enable
Запрещает (-n) или снова разрешает применение встроенной команды.
Когда запрещается, то вместо встроенной команды ищется файл, если
его нет -- ошибка
exec
Если имеется аргумент, заменяет текущий процесс (bash) на выполняемую
команду, и к башу возврата уже не происходит:
PerlProgram $scriptname && exec perl $scriptname
Если аргумент не указан, но указаны символы перенаправления, exec
устанавливает эти перенаправления, и выполнение текущего скрипта
продолжается. Подробнее см. [[Перенаправление]]
Таким образом достигается [[динамическое]] перенаправление.
echo Эта строка выводится на экран
exec >file.txt
echo А эта строка в файл
echo И эта в файл
Более того, можно открывать для ввода или вывода новые дескрипторы:
# создать файл-пример для последующего чтения
cat << EOF >user.rsp
29.06.77
30.01.85
EOF
exec 3>file.log
exec 4<user.rsp
echo Вводим дату через дескриптор 4
read d <&4
echo Дата получена и будет записана через дескриптор 3
echo $d >&3
getopts
getopts названия-опций переменная [ альтернативные-аргументы ]
Действует аналогично Си-функции getopt . Названия опций состоят из
букв, соответствующих опциям. Если опция требует аргумент, после буквы
ставится двоеточие.
Понимает "--" и дальше опции не смотрит Ни фига не понимает длинные .
опции (--опция) .
! Если есть альтернативные аргументы, то анализируют их, а не $1-$n
Если опция имеет аргумент, он помещается в OPTARG.
OPTIND сначала равен 1, затем гетопт его увеличивает. Если надо
запустить гетопт снова, надо снова присвоить единицу.
После первого неудачного гетопта ($? не равен 0) $OPTIND равен номеру
первого аргумента, не являющегося опцией, если такой есть ($OPTIND
<= $#). Чтобы обработать этот и последующие аргументы, нельзя писать
${$OPTIND}, поскольку номер параметра обязан быть константой. Вместо
этого нужно сделать
shift $[$OPTIND-1]
и обращаться к $1 и т. д.
Если ошибочная опция, в переменной присваивается "?", и выдается
сообщение об ошибке. Чтобы запретить вывод сообщений, надо или OPTERR=0
(по умолчанию 1), или первый символ в названиях опций ":".
Пример:
while getopts "qhe:v" arg
do
echo "Opt: $arg ${OPTARG:+($OPTARG)}"
case $arg in
q) quiet=1;; # установить quiet mode
h) echo Using: $0 [-q] [-h] [-e scriptfile] FILES...;
exit;;
e) scriptfile=OPTARG;; # задать файл с программой
esac
done
shift $[$OPTIND-1]
while [ -n "$1" ]
do
echo Processing file $1...
# разные действия...
shift
done
hash
Показывает таблицу запомненных расположений команд. Можно стереть (-r),
вопрос только в том, зачем то и другое.
pushd, popd, dirs
dirs выводит стек запомненных директорий
popd удаляет или последнюю запомненную, или такую-то по счету сверху
стека (+0..n) или снизу (-0..n).
type
Похожа на команду which.
Информация о том, как проинтерпретировалась бы команда, будь
она набрана в командной строке: Полное имя файла или сообщение
типа 'shell builtin' или 'aliased to...'.
можно только тип ( -t): file, builtin, alias, keyword
Можно вывести все альтернативы ( -a ), например
type -a ls" вернет "ls.exe и shell builtin"
ulimit
Показывает или устанавливает ограничения на что-либо. Можно показать все
ограничения (-a)
umask
Атрибуты, с которыми создаются файлы данного пользователя. Без
параметров показывает текущие в виде числа или букв (- S)
alias, unalias
создают и удаляют прозвища
ИСТОРИЯ КОМАНД И КОМАНДЫ ИСТОРИИ
history
Показывает всю историю, или последние n команд.
символ !
!! -- Предыдущая команда
!-n -- энная с конца команда
!n -- энная с начала команда
!строка -- одна из последних команд, начинающаяся строкой
!?строка -- -"- содержащая строку
^строка1^строка2 -- последняя команда, в которой строка1 заменена
на строку2
команды fc и многие другие, пока лень разбираться.
ПЕРЕМЕННЫЕ
PS1, PS2, PS3, PS4, PROMPT_COMMAND
Подсказки, по умолчанию:
PS1 "bash\$"
Если пусто ([ -z "$PS1" ]) , шелл не интерактивный.
[ -n "$PS1" ] && echo interactive || echo batch job
PS2 ">" -- запрос продолжения ввода
PS3 "" -- подсказка при read
PS4 "+" -- команда, выполненная в режиме трассировки (set -x)
PROMPT_COMMAND -- команда, выполняемая всякий раз перед показом PS1
Есть динамически вычисляемые escape-последовательности:
\w -- текущий каталог (полный путь)
\W -- текущий подкаталог, без пути к нему
\u -- user
\h -- host
\$ -- "$" для обычного пользователя и "#" для root
и т. д.
Другие
RANDOM
PWD
OLDPWD
REPLY -- см. read и select
BASH -- путь к текущему башу
SHLVL -- номер копии баша ?
SECONDS -- сколько секунд запущен баш
LINENO -- номер строки в текущем скрипт-файле или функции
BASH_VERSION -- версия баша
HOSTTYPE -- тип машины, напр.: "PCAT" (IBM PC AT), "i586"
OSTYPE -- тип операционной системы, напр.: "MSDOS", "linux",
"freebsd2.2.5"
MAIL -- файл, в который приходит почта, если не задано, что-нибудь
вроде
/var/mail/user
MAILCHECK -- через сколько секунд проверять почту, по умолчанию 60
OPTARG, OPTIND, OPTERR
Результаты последнего getopts (см.)
булевые
nolinks -- если установлена, превращать symlinks в настоящие файлы
noclobber
выдавать ошибку при попытке перенаправить (">") в существующий файл,
но можно использовать ">|"
И другие...
ОПЕРАТОРЫ
другие
until test-commands; do consequent-commands; done
while test-commands; do consequent-commands; done