�ڶ��£���һ��Sha-Bang��#!����ʼ

 

Shell��̾���һ��1950������Զ��㳪����

 Larry Wall

����򵥵�����£��ű����򲻹��Ǵ洢��һ���ļ����ϵͳ�����б�������������ִ���� ʱ�������°�˳�������ͬ���ܵ��������С�


���� 2-1. cleanup: һ�����/var/logĿ¼�µ���־�ļ��Ľű�

   1 # Cleanup
   2 # ������root�û�����.
   3 
   4 cd /var/log
   5 cat /dev/null > messages
   6 cat /dev/null > wtmp
   7 echo "Logs cleaned up."

��û��ʲô��ͬѰ���ģ���������һ��������׵شӿ���̨��xterm(����ע��һ��ͼ���������̨). )��˳�������������һ�ֽű���������������ô���ʹ�㲻��ÿ��ִ����ͬ����ʱ���ظ���˳��������ǡ��ű������һ������, ������Ҳ�����׵���һ��ʵ����Ŀ���޸Ļ��߶��ơ�


���� 2-2. cleanup: һ���Ľ����cleanup�ű�

   1 #!/bin/bash
   2 # Bash�ű���ȷ��ͷ��.
   3 
   4 # Cleanup, �汾 2
   5 
   6 # ��Ҫ��root����.
   7 # �������root�û����ڴ˴����Ӵ�����Ϣ��ӡ������˳�����.
   8 
   9 LOG_DIR=/var/log
  10 # ʹ�ñ�����ʹ��Ӳ���루hard-coded�����á�
  11 cd $LOG_DIR
  12 
  13 cat /dev/null > messages
  14 cat /dev/null > wtmp
  15 
  16 
  17 echo "Logs cleaned up."
  18 
  19 exit # ���Ǵ�һ���ű����˳���ȷ���ʵķ���

��������������һ�������Ľű��ˡ����������ǽ����ĸ��á�


���� 2-3. cleanup: һ������ű�����ǿ�棬�����ܴ�������

   1 #!/bin/bash
   2 # Cleanup, �汾 3
   3 
   4 #  ע��:
   5 #  -------
   6 #  ����ű�ʹ�����൱������ԣ���Щ�����Ժ󽫻����.
   7 #
   8 #  ����ʱ�����Ѿ�ѧ���Ȿ���һ���ˣ��㽫�����ٶ�shell�о������ˡ�
   9 #
  10 
  11 
  12 
  13 LOG_DIR=/var/log
  14 ROOT_UID=0     # ֻ���û�ID����$UIDֵΪ0���û�����rootȨ��.
  15 LINES=50       # Ĭ�ϵ�����
  16 E_XCD=66       # ���ܽ��뵽Ŀ¼ʱ���˳�����ֵ
  17 E_NOTROOT=67   # ����root�û�ʱ�˳��Ĵ���ֵ
  18 
  19 
  20 # ������root�û����У����½��м��
  21 if [ "$UID" -ne "$ROOT_UID" ]
  22 then
  23   echo "Must be root to run this script."
  24   exit $E_NOTROOT
  25 fi  
  26 
  27 if [ -n "$1" ]
  28 # �����Ƿ��ṩ�������в���(���Dz��������в���������һ������)
  29 then
  30   lines=$1
  31 else  
  32   lines=$LINES # Default, if not specified on command line.
  33 fi  
  34 
  35 
  36 #  Stephane Chazelas����,
  37 #+ ������һ�ָ��õļ�������в����ķ�����
  38 #+ ���Ƕ���������˵������Щ�߼���
  39 #
  40 #    E_WRONGARGS=65  # �������ֲ��� (������ʽ����)ʱ���˳���
  41 #
  42 #    case "$1" in
  43 #    ""      ) lines=50;;
  44 #    *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
  45 #    *       ) lines=$1;;
  46 #    esac
  47 #
  48 #* ��������"ѭ��"�����Ķ���ͷһ����ȥ�˽�����Ĵ�����˼.
  49 
  50 
  51 cd $LOG_DIR
  52 
  53 if [ `pwd` != "$LOG_DIR" ]  # Ҳ������  if [ "$PWD" != "$LOG_DIR" ]
  54                             # �������Ŀ¼����/var/log��?
  55 then
  56   echo "Can't change to $LOG_DIR."
  57   exit $E_XCD
  58 fi  #�ڲ��������־�ļ�֮ǰ�ٴμ���Ƿ�����ȷ��Ŀ¼��
  59 
  60 # �����������ٴ�ȷ���Ƿ�����ȷ��Ŀ¼�
  61 #
  62 # cd /var/log || {
  63 #   echo "Cannot change to necessary directory." >&2
  64 #   exit $E_XCD;
  65 # }
  66 
  67 
  68 
  69 
  70 tail -$lines messages > mesg.temp # ����message��־�ļ�����漸����־��Ϣ����ʱ�ļ�.
  71 mv mesg.temp messages             # Ȼ������ʱ�ļ�����messages��־�ļ�
  72 
  73 
  74 # cat /dev/null > messages
  75 #* ��������messages��־�ļ�ȫ����գ�����û������������������а�ȫ
  76 
  77 cat /dev/null > wtmp  #  ': > wtmp' and '> wtmp'  have the same effect.
  78 echo "Logs cleaned up."
  79 
  80 exit 0
  81 #  
  82 #һ���ű���0Ϊ�˳���������ű�ִ�гɹ�.

��Ϊ����ܲ���ϣ��������ϵͳ��־����գ���������汾��cleanup��������־�����ļ�����־��¼����������Ŭ����ѧ��ȥ�����ᷢ�ָ��ྫ����д������������Ĵ��롣

�ڽű���ͷ�� sha-bang ( #!) �Ǹ���ϵͳ����ļ������ض�������������͵�һ����� �Ǹ� #! ʵ�����������ֽڵ� [1] ħ��, ħ����ָ���ļ����͵�����Ǻţ��ڴ��DZ�ʾ����һ����ִ�е�shell�ű������� man magic���˽�������Ϣ����������#!����һ��·����.���·�����ǽ�������ű����������������������·����������һ��shell��Ҳ������һ��������Ի�����һ��������������������������ִ�нű��ڵ�������䡣���ӽű���ͷ������#!�����е���һ�У���ִ�У����Ǻ���ע���С� [2]

   1 #!/bin/sh
   2 #!/bin/bash
   3 #!/usr/bin/perl
   4 #!/usr/bin/tcl
   5 #!/bin/sed -f
   6 #!/usr/awk -f

����ÿһ���ű�ͷ�ж��Dz�ͬ������������������һ����/bin/sh, �Ǿ���Ĭ�ϵ�Shell(Linuxϵͳ��bash��Ĭ�ϵ�shell)������Ļ����������Ľ�����. [3] ���ʹ��#!/bin/sh/bin/sh����Ϊ��಻ͬ����ҵUNIX��ʹ��Bourne shellΪĬ��shell������ʹ�ű��ܹ���ֲ����Linux�Ļ����ϣ���Ȼ�������㽫����ʹ��Bash�������е����ԡ����������Ľű���ѭ POSIX [4] sh��׼.

ֵ��ע����ǣ���"#!"�����ṩ��·����������ȷ�ģ����������нű�ֻ���յ�ͨ����"Command not found"�����Ĵ�����Ϣ��

����ű�����ֻ����һ����ͨ��ϵͳ�����û��ʹ��Shell��������Ļ�#!�������ԡ�����ĵڶ������ӱ�Ҫ����#!,��ͷ����Ϊ������ֵ(lines=50),���ʹ����Shell�����е���䡣�ٴ�����ʹ��#!/bin/sh������Ĭ�ϵ����������������Linuxϵͳ����/bin/bash.

Tip

���ָ�Ϲ���ʹ��ģ�黯�ķ�����д�ű��������¼��ģ�塱�Ĵ���Ƭ���Ա������Ľű�ʹ�á������������һ���ܺõĿ���չ�����̿⡣����Ĵ���Ƭ�Ͽ��Բ��Խű��Ƿ���ȷ����Ŀ�������á�

   1 E_WRONG_ARGS=65
   2 script_parameters="-a -h -m -z"
   3 #                  -a = all, -h = help, etc.
   4 
   5 if [ $# -ne $Number_of_expected_args ]
   6 then
   7   echo "Usage: `basename $0` $script_parameters"
   8   # `basename $0`��ָ�ű����ƣ����ߣ���������ں����½ڻὲ).
   9   exit $E_WRONG_ARGS
  10 fi

�ܶ�ʱ�����дһ��ִ��ʵ�ʹ��ܵĽű������µĵ�һ���ű�����һ�����ӡ��Ժ������ܻ�ʹ����������ű���չ��������Ƶ�����ʹ�ñ�������̶����ַ��������Ǻõİ취���������İ취�������������淴��ʹ�õĴ���顣

2.1. ���нű�

д��һ���ű������ܹ������������sh scriptname, [5] ����ҲҲ������bash scriptname. ��ִ�У����Ƽ�ʹ����sh <scriptname, ��Ϊ�������ֹ�ű��ӱ�׼����������ݣ�����Ϊ������������ʹ��chmod������ʹ�ű�������Ϊ��ִ�е�.

�����:

chmod 555 scriptname (ʹÿ���˶��ж���ִ�е�Ȩ��) [6]

Ҳ������

chmod +rx scriptname (ʹÿ���˶��ж���ִ�е�Ȩ��)

chmod u+rx scriptname (����ʹ�ű��ļ�ӵ�����ж���ִ�е�Ȩ��)

�ڸ��ű�����ִ��Ȩ��֮������Ժ����׵�ʹ��./scriptname. [7] ��ִ����������ű���"#!"�п�ͷ�����������ȷ�������������ִ����.

��󣬰ѽű����Բ�������������ѽű���ϵͳ�������������û�ʹ�ã���Ӧ�ðѽű��Ƶ�Ŀ¼/usr/local/bin ��(��Ȼ�������Ҫ��root��Ȩ��),����ֻ��򵥵�������������scriptname [�س�]����ִ�нű��ˡ�

ע�ͣ�

[1]

һЩ����ϲ����UNIXϵͳ�����Ƕ�����4.2BSD���Ľű����ĸ��ֽڵ�ħ�������ַ���!������Ҫ��һ���ո� -- #! /bin/sh.

[2]

The #!�н������������(sh����bash)��Shell�ű������ȿ����ġ���Ϊ������#�ַ���ͷ���������������ִ�нű�ʱ������ȷ�İ���һ�е���ע�������Դ������иոպ�ֻ������������������������á�

��ʵ�ϣ�����ű������˶����#!�У�bash�����������һ��ע��.

   1 #!/bin/bash
   2 
   3 echo "Part 1 of script."
   4 a=1
   5 
   6 #!/bin/bash
   7 # ������������һ���µĽű�.
   8 
   9 echo "Part 2 of script."
  10 echo $a  # Value of $a stays at 1.

[3]

���������������������ҵ�һЩ��Ȥ������.

   1 #!/bin/rm
   2 # ɾ�������Ľű�.
   3 
   4 # ������������ű�ʱ����������ű���ʧ��֮�⣬�㲻�ᷢ�ָ��������Ķ�����
   5 
   6 WHATEVER=65
   7 
   8 echo "This line will never print (betcha!)."
   9 
  10 exit $WHATEVER  # ��Ҫ�����ű����������е����.

Ҳ����дһ����#!/bin/more,��ͷ���ļ�����ִ������ִ�н���ᷢ������һ��������ʾ���ļ��� (һ��ʹ��cat�����here document �ܸ��õذ쵽��һ��--�ο����� 17-3).

[4]

����ֲ����ϵͳ�ӿ�(Portable Operating System Interface),������ʹ��UNIX�IJ���ϵͳ��׼����POSIX�Ĺ淶������վ��Open Group site�ҵ�.

[5]

ע�⣺��sh scriptname����һ��Bash�ű������ֹ����Bash����չ���ԡ���˽ű����Ի���˶�����ʧ�ܡ�

[6]

��Ϊ����һ���ű��ļ���ҪShell�ܶ����ļ��е������˲�����Ҫ�ļ���ִ��Ȩ�ޣ�Ҳ��Ҫ�ļ��ж���Ȩ�ޡ�

[7]

Ϊʲô��ֱ���ü򵥵ؼ���scriptname�����нű�? �����ǰĿ¼���ɱ���$PWD)��ֵ����[����ע��Ҳ��������pwd��ӡ��ǰĿ¼·��]������scriptname �ű��ļ����ڵ�Ŀ¼��Ϊʲôֱ�Ӽ���scriptname�������нű�? �������нű�����ʧ�ܡ���Ϊ���ڰ�ȫ������[����ע����������Ȥ�Ļ�������һ����ȫ©������LinuxSir��Shell�����ҷ���һƪ�������ҵ�]��ǰĿ¼Ĭ�ϲ����뵽�û���$PATH.�����С�����������ȷ��ָ�����ýű���·���ڵ�ǰ·����./scriptname.