����������� ����������� �� ���������������� �� ����� Bash:

������ ����������� �� ��������� ���������� ������ ��� �������� 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.) 1