������ ����������� �� ��������� ���������� ������ ��� �������� Bash
Mendel Cooper
Brindlesoft
thegrendel@theriver.com
��� ������� �� ������� ����������� ����� � ������� ��������� ���������� ������ ��� ����������������, �� ��� ���� ������ ������������� �� ������� ������� � ������� ��������� (... � �� �� ����� ��������� ������� �������� � �������� UNIX). ��� ������ ��� �������, ����������� ��� ���������������� ��������, � ����� ��� ���������� � �������� ������ � ��������� ��������� ���������� ������. ���������� � ������� �������� � ��������� ������������� ���������� �� �������� ������� ��������, ������ �� ����������� ��� ��������� ������ ���������� ����� ����� ����� ����� ��������� ���������� ������.
Dedication
For Anita, the source of all the magic
����� 1. ��������
Shell (���������� ��������� ��� ��������) ������������ ����� ���������� �������. ��� �� ������ ��������, ����������� ���� ������������ ������� � ������������, �� ��� � ���������� �������������� ���� ����������������. ��������� ��� ��������, ������� ������ �������� ����������� ������� ��� ���������, ������ ��� ���������� ������� ��������� ��������� �������, ������, � �������� ������. �� ����������� ����� ����� ��������� ����������� ����� ������� ��� �������� �� �������� UNIX. � ������� � �����, ����� ���������� �������� �������� ��� ��������� �������� ������� � ��������� ����� ��� ����� ����������� ����������� ��������. ���������� ����� ����� ������ �������� ��� ������� ����� ��������� � ��������� ������������������ � ������ ����� ����������� �������� ������� �� ������� ���� ��������� ������������ ������������ ����� ����������������.
����� 1. ��� ���� ����� ���������������� � ��������?
������������ ������ � ������ � ����������� ������� ����� ������� ��� ����� ���������� ������ ����������� � ������������� �������, ���� ���� ��� ������ ������� �� ����������� �������� ���������� ����. ��������, ��� ����� ��������� � Linux �����������, �� ��������� ���������� ����� � /etc/rc.d ��� ���� ����� ������������ ������������ ������� � ��������� ��������� ���������. �������� ��������� ����� �������� ���������� ������ ����� ��� ������� � �������� ��������� � ������ �������.
��������� ������ ���������� ����� ��� �������� �� ������, ��� ��� �� ����� ���������� �� ��������� ������, � ��� ����� ����� ����� ���� ���������� ��������� ���������� ���������� � �����[1]. ��������� ����� ����� � �� ������ ����� �� ������� ������� � ������������� ������ � ���������� ������, ��� ���� ����� ��� ������� ����� ����� �� ��� ����� "������". ����������� �������� ���������� ������ �������� ��������� � ������� ����, � �������� ���� ������� ���������� ����� �� ��� �� ������.
���������� ���� ����� ������������ ��� ��������� "�� ������ ����" �������� ������� ���������. ��������� ����������� (���� � ��������) ������� �������� ������� �������� ��������� - ��� ������ ��� � �������� �������. � ������� ���� ��������� �������� ��������� ����� ���� ���������� � ��������������, � ����������� ��������� ������� ����� ���� ���������� ��� �� ������ ��������� ��������� � ��, ��++, Java, ��� Perl.
������������� ���������� ������ ������� ���������� � ������������ ���������� UNIX, ���������� ���������� ������� ����� �� ����� ������, ����������� � ���� ���� ������������ ����������� � ������. ������ �������� ��� ������, ��� �� ������� ���� ����� ����������, �������� � ������� ������ ������� ��� ���������� ������ �� �������������� ��������������� ������ ������ ���������, ����� ��� Perl. ��� ����� �������� ���� ���������������� � ����������������, �� �������� ������ ����� - ������������� �������� ���� ������������ ������� ��� ����, ����� ������������ ����� ����.
������ ����� ���������� ����� �� ������� ���������
* ��������, ������������ ������� ���������� ��������� ��������,
�������� ���� ���� ����� �������� (������������, ����������� �������������
��������, ���.)
* ������, ���������� � ���� ������� �������������� ��������,
� ����������� �������������� �������� � ��������� ������(�������), ����������
� ������������ ���������, ��� ������� ����� (����������� ��++ ��� FORTRAN)
* ���� ��������� �����-����������� ������������� (����� �����������
��������� �������� ����� ��������� �� ������ ���������), ����������� ��
* ������� ��������� ��� ������� ���������� ����������� ����������������
(��������� �������� ���� ������ ��� ����������, ��������� �������, ���.)
* �������� ������ ����������� ����������� �� �������� �������
�������� ����� �����������
* �������� � ������� ����� ������������ ���������, ����������
������������� ����������� ����� ������� � ������������� �������������������
������, �����, � ���������
* ������ ������� �� ��������������� �����������
* ��������� ������ ����� ��������� ����� �������� � ������� (Bash
����� ������ ���������������� ������ � ������, � ���������� ��� ����������
��������� ���������� ��������)
* ��������� ����������� �������
* ��������� ��������� ������, �������� ������� ������ ��� �������
* ��������� ������ ����� ������������ ��� ���������� � ������������
������������� ��� � ����������� ����������� ������������
* ��������� ������ ������ � ���������� �������
* ���������� ������������ ����/����� ����� ����� ��� ������
* ��������� ������ ������������ ���������� ��� ����������� �
������������� ������� �����������
* ��������� � ������� ��������, �� ������� �������� ������� (��������
����� ����������� ����� ���������� ������)
� ����� �� �������, ������������� ����, ������� ��������� ����� �������������� ���������� ����, �������� Perl, Tcl, Python, ��� ����� �������������� ���� ��� ��, ��++, ��� Java. �� ���� ����� ���������� ��������� ����� ��������� � �������������� ���������� ������ ����� ���� �������� ����� � �� ����������.
�� ����� �������� � ��������� Bash. �� ������ ��������, "Bourne-Again Shell", �������� ���������� �� �������� �������� ������� �����, ����������� ������������ - Bourne Shell. Bash ���������� ����� ����������� ��������� ��� ��������� ���������� ������ �� ���� �������������� UNIX. ����������� �������� ������� ������� ����� ��������� � ���� ����� ��������� � � ��������� ���������� ������ ��� ������ ����� ��������, � ��� ����� Korn Shell, ��������� �� ������������ ������� ������������ Bash[2], � ����� C Shell � �� ���������. (������� ������� ��� ���������������� � ��������� C Shell �� ������������� �� �� ��������� ������� ������� �� �������, ��� ��������� � ��������� ��� ��������� ������ ������� ������ ��� ���������� (Tom Christiansen) � ������� 1993 ����.
������ �������� �������� ������� �������� �� ��������� ���������� ������. ��� ����, ����� ������������������ �������� � ����������� ��������, � ��� ����� ������������ ������� ��������� ���������� ������. �� ������� ��� ���� ��������, ��� ���������� ����� ������������ ��� ������� ���� ���������, � ��������� �� ��� ���� ����� ��������� ������� � �������� �����. ��� ���� ����� ���������� �������� ����������� ����� ��������������� � �����-���� �������, �������� ������� ������������ ��������������� ���� � ������ ���������� ������ (��������_�����������_�����.sh), ������� ���� ���� ����������� (chmod u+rx ��������_�����������_�����.sh)[3] � ��������� ���. ���� ����������� ����� ��� � ������, ���������� ��� ����� ����� �� ����� ���������. ��������� �� �������� ����� �������� � ���� ��� �� ���������� ��������, �� ����� �������� �������� ��������� ����� �� ������� �������� ������ ����� ����������� � �������� ���� ���������� ������.
������� ��������, ����� ������� �� ������, �������� ������� ���� �����.
����������
[1]
��� ��� ���������� ���������� ���������, ���������� ������� ��������.
[2]
� Bash ���� �������� ������ �� ksh88 � ���� ���-��� �� ����� ksh93.
[3]
������ ���������� ������, ��������������� ���������� �������� Bourne,
���� ���������� .sh. ��� �� ���������, ������, � ��������� ����������
������ ����� ���, ��� ��������� � �������� /etc/rc.d.
����� 2. ��� ���������� � �������.
���������� ���������� ���� ����� ���� ����� ���� ��� ����������� ���������� ����������, ������������ � �����. �� ������� ���� ��� ��������� �� ������������� ������� �� ����� ��� ��� �������� ������ ��� ����� �� ����� ���������.
������ 2-1. ������: ���������� ����, ��������� ��� (����������)
����� � /var/log
# ������
# �������, ��������� ���� ���������� ���� ������� �������������������
��� �������������
cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "��� ����� �������."
������ ����������, ������ ����� �������, ������� ����� ����� ����� ���� ��������� ���� �� ������ � ���������� ������ �� ������� ��� � xterm. ������������ ���������� ������ � ���������� ����� �� ������ � ��� ��� ��� �� ����� ����� �������������� �� ����� � �����. ���������� ���� ����� ����� ��������, ��������, ��� ������������ ��� �����-���� ������������� ������� ����������.
������ 2-2. ������: ���������� � ���������� ������ �����������
����� ��������������� ����
#!/bin/bash
# ������, ������ 2
# ���������� ������������������� ��� �������������.
LOG_DIR=/var/log
ROOT_UID=0 # ������ ������������ $UID �������
����� 0 ����� ����� �������������� (root).
LINES=50 # ������� ����� �����
��������� �� ���������.
E_XCD=66 # �� ������� ����������
�������?
E_NOTROOT=67 # ��� ����������, ������������ ��� ����������
��-���������������.
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "������ ������������� ����� ��������� ���� ���������� ����."
exit $E_NOTROOT
fi
if [ -n "$1" ]
# ���������, ���-�� ��� �������� � ���������� ������ (�.�. ��������
�� ������).
then
lines=$1
else
lines=$LINES # ���������� ����� �� ���������, ���� �� �������
�� ���������� ������.
fi
#������� ������� ���������� ����������
#������ �������� ���������� � ����������
#������ (�������������� ����), �� ��� �������
#����������� �������� ��� ����, ����� ���
#������������ � ������ �������.
#
# E_WRONGARGS=65 # �� �������� �������� (������������
����� ���������)
#
# case "$1" in
# "" ) lines=50;;
# *[!0-9]*) echo "����������: `basename $0` ��������-����-����";
exit $E_WRONGARGS;;
# * ) lines=$1;;
# esac
#
#* ����� ����������� � ����, ��������� � ������ "��������� �����".
cd $LOG_DIR
if [ `pwd` != "$LOG_DIR" ] # ��� if [ "$PWD" != "LOG_DIR"
]
# ��������� �� � /var/log?
then
echo "�� ������� ������� � $LOG_DIR."
exit $E_XCD
fi # ��������� ��� ��������� � ���������� �������� ����� ���
��� ������ "���������" ��� ����.
# ��� ����� ��� ����� ������� ���:
# ---
# cd /var/log || {
# echo "�� ������� ������� � ������ �������." >&2
# exit $E_XCD;
# }
tail -$lines messages > mesg.temp # ��������� ��������� ����� ��� �����
���������.
mv mesg.temp messages
# ���������� ����� ��� ������.
# cat /dev/null > messages
#* ��� ������ �� �����, ��� ��� ������, ��������� ����, ����� ���������.
cat /dev/null > wtmp # > wtemp �������� � ����-��
����������.
echo "��� ����� �������."
exit 0
# ��� ����������, ������ ����, ��������� ��������
# �� �������� ���������� ����������� �����.
��� ��� �� ������ �� ������ �������� ���������� ����� ���������, ���� ������� �� ������� ������� ��������� ��������� ����� ��� ����� ���������. �� ������ ��������� �������� ����� ������� ��������� � ���������� ������������� ����� ���������� ���������� ������.
������ (#!) � ������ ����������� ����� ������� ����� ������� ��� ���� ���� ������������ ����� ����� ������� ������� ����� ����������� � ��������� ���������� ���������. ������-�� #! ��� "��������� �����" �������� � ��� �����[1] ������� ������������ ��� ����������� ������� �� ������� ����� ������ ��� �����, � � ������ ������ ��� ����������� ���������� ���� (����� ������ �� ���� ������, ��������� � ���������� �������� � "��������� ������" (man magic)). ����� ����� ������� ���� ��� �����. ��� ��� ��������� ������� ����� ��������� �������� � ���� ���������� �����, ����� �� ��� ��������, ����������� ����, ��� �������. ���� ���������� ��������� ����� ��������� ������ �� ������� � ���� �����, ������� � ������ ����� (� ������ ������) ��������� �����������[2].
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
�������� ��� ���������� ������, ����������� ����, �������� ��������� ���������� ����������, �������� �������� /bin/sh, ������������ �� ��������� (bash �� �������� � Linux) ��� ���-�� ������[3]. �������� #!/bin/sh, �.�. �������� Bourne Shell, ������� ������������ �� ��������� �� ����������� ������������ ������ UNIX, ������ ���������� ���� ����������� �� ���������� �� ������� �������� �� Linux, ���� ��� �������� ��������� ������������ ���������� ���������� ������� �������� ������ � Bash (����� ���������� ���� ����� ��������������� ��������� POSIX[4] ��� �������� sh). �������� ��� ������ ��� �����, ��������� ����� "�������" ������ ���� ����������, ����� ��������� �� ������, ���� ����� "�������� �� �������" ("Command not found") ����� ������������ ����������� ���������� ������ ����������� �����.
#! ����� �� ����������� ���� ���������� ���� �������� ������ ������� ��������� �������� � �� ���������� ���������� ��������� ��������. ������ 2 ����������� ����, ������� ������������� #! ��� ��� ������ �� ������� ���������� ������������� ��������, lines=50, ���������� �������� ��������� ������ ��������. ��������, ��� #!/bin/sh �������� ��������, ������������ �� ���������, ��� �� ���������� � Linux �������� /bin/bash.
������ ���������
��� ����������� �������� ��������� ������ � ���������� ���������� ������. ��������� � ���������� ��� ���� ����� ������ �������� ������� ����� ����������� ��� ����������� �������� ���������� ������. �� �������� �� ������� ������� �������� ��������� �������� �������. � �������, �������������� ���� ��������� ����� ����������� ����� ���������, ���������� �� ���������� ���������� ������������ ��� ��� �������.
if [ $# -ne �������_�����_����� ]
then
echo "����������: `basename $0` ���� ���������"
exit $WRONG_ARGS
fi
����������
[1]
��������� ������������� UNIX ���������� "��������� �����" �� ������� ������, ������ ������ ����� !, #! /bin/sh.
[2]
� ���������� ������ ������ � #! ����� �������� ���������� ����������� (sh ��� bash) � ������ �������. ��� ��� ��� ������ ���������� � #, ��� ���������� ����� ������� �� ����������� ��� ���������� �����. ��� ������ ��� ��������� ���� ����, ������ ���������� ���������.
[3]
��� ��������� ������ ��� ��������� ���������.
#!/bin/rm
# ������������������ ���������� ����.
# ����� �� ���������� ���� ����, ������ ���������� �� ����������... �� ����������� ����, ��� ��� ���� ��������.
WHATEVER=65
echo "������ ��� ��� ������ �� ����� ������ �� �����?"
exit $WHATEVER # �� ����� ��������. ���������� ��� ����� �� ���������� �����.
��� ���������� ���������� #!/bin/more �� ������ ������ ���������������
����� (README) � ������� ��� �����������. �� �������� �������������� ����
������� ����� ������������� �������� ���� �� �����.
[4]
Portable Operating System Interface (����������� ��������� ������������ �������), ������� ����������������� UNIX��������� ������������ �������.
2.1. ������ ���������� ������.
����� ���������� ���� �����, �� ������ ��������� ��� ��������� sh ��������_������_�����������_����� [1] ��� bash ��������_������_�����������_�����. (�� ������������� ������������ sh <��������_������_�����������_�����, ��� ��� � ���� ������ ���������� ���� �� ����� �������� ���������� �� ������������ �����(stdin).) �� ������� ������� ������� ��� ���������� ���� ����������� � ������� chmod.
����������� ���� �� �������:
chmod 555 ��������_������_�����������_����� (���� ���� �����
������������� � ��������� ����) [2]
chmod +rx ��������_������_�����������_����� (���� ���� �����
������������� � ��������� ����)
chmod u+rx ��������_������_�����������_����� (���� ������ ������������ �������� ����������� ���� ����� ������������� � ��������� ���)
������ ���������� ���� �����������, �� ������ ���������� ��� ����� ./��������_������_�����������_�����[3]. ���� �� ���������� �� ������ � "��������" �� ��� ������ �������� ���������� ��������� ������� ������ ��� ��������� ���������.
� ������� ����� ������������ � ������� �� �������� �������� ��������� ��� ���������� ���� � /usr/local/bin (�������, ������������������� ��� �������������) ����� ���� ���� � ������ ������������� ����������� ������������ ��� ��� ������������ ���������. ����� ��� ����� ����� ��������� ������ ��������� ��������_������_�����������_�����[����] �� ���������� ������.
����������
[1]
���������: ������ ����������� ����� ����������� ��� Bash ����� sh ��������_������_�����������_�����
��������� ��������� � �������� ������� ������������ ������ � Bash, �� �����
���������� ���� ����� ���� �� ��������.
[2]
�� ������� ����� ��������� (read) ��� � ���������� ��� ���� ����� ���
���������, ��� ��� �������� ������ ����� ����������� ��������� ���.
[3]
������ ������ ��������� ���������� ���� ������ ������ ��� ��������?
���� ���������� ���� ��������� � ����� ������� �������� ($PWD), ������
��� �� ���������? ������ ��� �� ����������� ������������ ��������
�������� �������� �� ������������ � ���������� $PATH ������������.
�� ����� ���������� �������� ���������� ���� � ������� �������� ���������
��� ������ ��� - ./��������_�����������_�����.
2.2. ��������� ����������
1. ��������� �������������� ����� ������� ����������
����� ��� ������������� ���������� ������������ �����. ���������
������� ����� ��� ���������� ������� �� �������� �� �������� ����������
�����.
2. �������� ���������� ���� ������� ��� ����������
���������� ����� � ����, ����������� �������������, ����������� � �������,
� ���������� ����� ������ ������� � ������� ���������� ������. ���
����� �� ������ ��������� ��� ��� ���������� � ���������� ����. (�����������
��������������� �����/������ � �������� date, who, � uptime.)