当前位置首页 > 百科> 正文

unix shell

2019-11-22 12:50:34 百科
unix shell

unix shell

Unix shell,通常被称作“命令行”,为Unix和类Unix作业系统提供了传统的用户界面。用户通过输入shell所执行的命令,引导计算机的操作。在微软Windows作业系统平台,类似程式是command.com,或者基于Windows NT核心作业系统的cmd.exe。

解释

shell术语最普通的解释就是:用户用来输入命令的任何程式。自从在Unix作业系统中用户能够选择所使用的shell(登录时应当执行哪种程式)以来,许多shell已经被开发出来。之所以被称为“shell”,是因为它隐藏了shell界面下面的作业系统的细节(这与最底层的“kernel”相反)。类似地,Unix图形化用户界面,注入GNOME、KDE和Xfce等,偶尔被称作“可视shell”或“图形shell”。shell术语通常与命令行相关联。在Unix中,任何程式都可能是用户的shell。希望使用不同语法输入命令的用户,可以指定一个不同的程式作为他们的shell。
术语shell也与一个特殊的程式相关,比如Bourne shell,sh。Bourne shell是早期版本Unix所使用的shell,并成为一个事实上的标準;任何类Unix系统至少拥有一个与Bourne shell相兼容的shell。Bourne shell程式位于Unix系统的“/bin/sh”。在某些系统中,比如BSD,“/bin/sh”是一个或等同于Bourne shell,但在Linux等其他系统上,“/bin/sh”更多的是一个兼容的、更加富功能性的shell连结。POSIX将其标準shell制定为Korn shell的一个严格子集。

功能

SHELL的主要功能
一.命令执行
二.输入/输出重定向
三.环境控制
四.后台处理
五.SHELL脚本

命令

关于档案/目录处理的命令
ls——列目录
这是最基本的档案指令。 ls 的意义为 "list",也就是将某一个目录或是
某一个档案的内容显示出来。
格式:ls -1ACFLRabcdfgilmnopqrstux -W[sv] [files]
例:
#ls (不跟任何参数以简单格式列出当前目录中所有档案)
#ls bin (简单格式列出名为bin的档案或目录下的所有档案)
#ls /u/ilasII_GB/lib (全路径,列出lib目录下的所有档案)
ls 的常用参数如下:
-a :在 UNIX 中若一个目录或档案名字的第一个字元为"." , 则使用 ls
将不会显示出这个档案的名字,我们称此类档案为隐藏档。如.profile、.tcshrc等
如果我们要察看这类档案,则必须在其后加上参数-a 。
-l :这个参数代表使用 ls 的长( long )格式,可以显示更多的资讯,如档案存取权,档案拥有者( owner ),档案归属组,档案大小,档案最后更新时间,甚而symbolic link 的档案是 link 那一个档等等。显示结果如下所示:
drwxrwxrwx 30 root bin 1024 May 23 10:38 u
drwxrwxrwx 2 root sys 512 Jul 28 1999 uacn
drwxrwxrwx 5 root sys 512 Jul 27 1999 udk
lrwxrwxrwx 1 root sys 11 Jul 27 1999 unix -> /stand/unix
drwxrwxrwx 35 root auth 1024 Apr 3 13:45 usr
在开始的10个字元上系统给出档案的用户许可权。该序列分成四个域。第一个字元为类型域,第2、3、4个字元为用户主域,第5、6、7个字元为同组用户域,第8、9、10个字元为其它用户域,域中字元的含义如下:
在类型域中: d 表示此档案是一个目录
表示此档案是一个普通档案 b 表示此档案是一个特殊的块设备I/O档案
c 表示此档案是一个特殊的字元设备I/O档案
l 表示此档案是一个连线档案。在其档案名称称后紧跟与它连线的档案路径及名称。如:
unix-> /stand/unix
在“用户主”、“同组用户”、“其它用户”域中: r 表示有读许可权。含义是可以拷贝或显示该档案或目录中的内容。
w 表示有写许可权。含义是可以改变或修改该档案。
x 表示有执行许可权。含义是可以执行该档案或用cd命令进入该目录,在该目录中建
立档案或子目录等。
表示无许可权。 chmod——变更档案模式( change mode )
这个指令是用来更改档案的存取模式( access mode )。在UNIX 一个档案上有可读(r)可写(w)可执行(x)三种模式,分别针对该档案的所有者(onwer )、同组者( group member )( 你可以ls -lg来观看某一档案的所属的 group ),以及其他人(other )。一个档案如果改成可执行模式则系统就将其视为一个可执行档,而一个目录的可执行模式代表使用者有进入该目录之权利。chmod就是用来变更一些档案的模式。
格式:chmod [ -fR ] mode filename ...
主要参数的意义如下:
-f(Force): chmod 不会理会失败的动作。
-R(Recurive): 会将所有子树下的所有子目录及档案改为你所要改成的模式。
Mode:指改变模式。包括三个方面:
为哪些用户改变 u——用户本身
g——同组用户
o——其他用户
如何改变 +——增加许可权
-——去掉许可权
什幺许可权 r——读许可权
w——写许可权
x——执行许可权
例:
#chmodg0+w file1
修改前file1的许可权为:-rwxr--r--
修改后file1的许可权为:-rwxrw-rw-
也可以用一个三位八进位数字来表示对某些对象的存取权。
例:
#chmod666 * (所有用户都可读、写)
#chmod777 * (所有用户都可读、写、执行)
cat——串联显示命令
例:#catfile1 (将档案file1的内容在萤幕上不停地显示出来)
Cat命令还可以用来建立档案,如:
#cat>newfile
this is a text
Ctrl+D
即建立newfile档案,内容为:this is a text
#cat file1 file2 >file3 (将file1,file2两个档案接起来生成档案file3)
#cat f1 f2>>f3 (将f1,f2两档案接在f3档案的尾)
more——分屏显示档案内容
more 可以将所观察的档案根据分屏显示出来,并根据使用者的要求换页或卷行。
如果使用者要在某一个档案中搜寻一个特定的字串,则按 / 然后跟着打所要搜寻的单字即可进行搜寻。
如果你在使用中觉得已经看到了所要看的部份,可以按'q'离开 more 的使用。
在使用中按'v' 亦可以使用编辑器来编辑所观看的档案。
格式: more filename
cd——改变当前目录
格式:cddirname
例:
#cd (到用户的“家”目录)
#cd /usr (将目前目录转移到/usr目录,也即进入/usr)
#cd .. (返回上一级目录)
#cd ../.. (返回上一级目录的上一级目录)
cp——拷贝
这个指令的意义是複製("COPY"), 也就是将一个或多个档案複製成另
一个档案或者是将其複製到另一个目录去。
格式:cp [-fip]source_file target_file (拷贝档案)
cp [-r|-R][-fip] source_file...target_file (拷贝目录)
常用参数如下:
-i :此参数是当已有档名为 f2 的档案时,若逕自使用 cp 将会将原来 f2的内容掩盖过去,因此在要盖过之前必须先询问使用者一下。如使用者的回答是y(yes)才执行複製的动作。
-r :此参数是用来做递迴複製用,可将一整颗子树都複製到另一个目录中。
cp 的用法例举如下:
#cpf1 f2 (将名为f1 的档案複製一份名为 f2 的档案)
#cpf1 f2 f3 ... dir (将档案f1 f2 f3 ... 複製一份放到目录 dir 里面)
#cp-r dir1 dir2 ( 将dir1 的全部内容全部複製到 dir2 里面)
mv——移动或改名
mv 的意义为 move , 主要是将一档案改名或移至另一个目录。
格式: mv [-fi] source_file... target_file
主要参数:
-i : -i 的含义与 cp 的相同,均是interactive询问之意。
-f: 强迫( force )执行 。所有其他的参数遇到 -f 均失效。
例:
#mvf1 f2 (将名为 f1 的档案变更成名为 f2 的档案)
#mvdir1 dir2 ( 将名为 dir1 的目录变更成名为 dir2 的目录)
#mvf1 f2 f3 ... dir (将档案f1 f2 f3 ... 都移至目录 dir 里面)
rm——删除
rm 的意义是 remove ,也就是用来删除一个档案。在 UNIX 中一个被删除的档案除非是系统恰好有做备份,否则是无法像DOS 里面一样还能够恢复。所以在做 rm 动作的时候使用者应该要特别小心。
格式: rm [-fiRr] file...
主要参数:
-f :将会使得系统在删除时,不提出任何警告讯息。
-i :在除去档案之前均会询问是否真要除去。
-r :递归式的删除。
注意:
不要随便使用rm-rf , 否则有一天你会"欲哭无泪"......
例:
rm f1 (删除名为f1的档案)
rm -r dir1 (删除名为dir1的目录及其下的所有档案)
rm-i sendmarc1 (删除名为sendmarc1的档案前先提示,待回答(Y/N)?)如下:
removesendmarc1 ? y
mkdir——创建目录
mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用
midir建立一个子目录。
格式:mkdir dirname1 [ dirname2 ... ]
例:
#cd/u/ilasII_GB (将当前路径置换为/u/ilasII_GB)
#mkdir ilasbak (在/u/ilasII_GB目录下创建一个名为ilasbak的子目录)
rmdir——删除目录
rmdir 是用来将一个"空的"目录删除。如果一个目录下面没有任何档案,你就可以用rmdir 指令将其除去。
格式:
rmdirdirname1 [ dirname2 .... ]
如果一个目录底下有其他的档案,rmdir 将无法将这个目录删除,除非使用 rm 指令的 -r选项。
例 :
rmdir ilasbak (删除名为ilasbak的空目录)
pwd——显示当前路径
例如:
#pwd
关于进程处理的命令
ps——显示目前你的 process或系统 processes 的状况
格式:
ps [-aAdefl] [-G groups] [-o format] [-p pids] [-ttermlist] [-u users] [-U users] [-g pgrplist]
常用参数:
-a 列出所有用户的 process 状况。
-u 显示 user - oriented 的 process 状况 。
-x 显示包括没有 terminal 控制的 process 状况 。
-w 使用较宽的显示模式来显示 process 状况 。
例:
#ps-ae (显示所有进程的进程号及状态)
#ps-u ilasnt1 (显示用户ilasnt1的进程状态)
PID TTY TIME CMD
1194 ttyp0 00:00:00 sh
#ps-t tty1a (显示设备tty1a上的进程)
如上所示:我们可以经由ps 取得目前 processes 的状况,如 PID(进程号) , TTY(设备名)、TIME(时间)、CMD(程式名) 等。
kill——杀进程
kill 指令的用途是送一个信号给某一个进程。因为大部份送的都是用来杀掉进程,因此称为 kill 。
格式:
kill[ -SIGNAL ] pid ...
kill-l
SIGNAL:为一个讯号的数字,从 0 到 31 ,其中 9 是 SIGKILL ,也就是一般用来杀掉一些无法正常终止进程的讯号。
你也可以用kill -l 来察看可代替signal 号码的数目字。

实例

#!/bin/ksh
_compare_2_date()
{
if [ $# -ne 2 ];then
can_archive=false
return 1
fi
can_archive=false
year1=`expr substr $1 1 4`
month1=`expr substr $1 6 2`
day1=`expr substr $1 9 2`
month1=`expr $month1 + 0`
total_month1=`expr $year1 \* 12 + $month1`
year2=`expr substr $2 1 4`
month2=`expr substr $2 6 2`
day2=`expr substr $2 9 2`
month2=`expr $month2 + 0`
total_month2=`expr $year2 \* 12 + $month2`
# echo "$total_month1,$total_month2,$day1,$day2"
if [ $total_month1 -lt $total_month2 ];then
can_archive=true
elif [ $total_month1 -eq $total_month2 ];then
if [ $day1 -lt $day2 ];then
can_archive=true
fi
fi
}
if [ $# -ne 1 ]; then
echo usage: 'log_file_purge.ksh [OFFSET_MONTH]'
exit 1
fi
echo "Purge log job start at :" `date "+%Y-%m-%d %H:%M:%S"`
export OFFSET_MONTH=${1}
export TOTAL_FILE=0
export ARCHIVAL_DIR=/appsdata/archive/logs
export LOG_SUFFIX=abc.log-
if [ ! -d "${ARCHIVAL_DIR}" ]; then
echo "Archival Log directory: ${ARCHIVAL_DIR} does not exists"
echo "Purge log job failed at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 1
fi
CURRENT_DATE=`date "+%Y-%m-%d"`
echo "Current date is $CURRENT_DATE"
CURRENT_YEAR=`expr substr $CURRENT_DATE 1 4`
CURRENT_MONTH=`expr substr $CURRENT_DATE 6 2`
CURRENT_DAY=`expr substr $CURRENT_DATE 9 2`
ARCHIVAL_YEAR=$CURRENT_YEAR
ARCHIVAL_MONTH=$CURRENT_MONTH
ARCHIVAL_DAY=`expr $CURRENT_DAY + 0`
while [ $OFFSET_MONTH -gt 0 ]
do
ARCHIVAL_MONTH=`expr $ARCHIVAL_MONTH - 1`
if [ $ARCHIVAL_MONTH -lt 1 ]; then
ARCHIVAL_YEAR=`expr $ARCHIVAL_YEAR - 1`
ARCHIVAL_MONTH=`expr $ARCHIVAL_MONTH + 12`
fi
OFFSET_MONTH=`expr $OFFSET_MONTH - 1`
done
PURGE_DATE=`printf "%04s-%02s-%02s" $ARCHIVAL_YEAR $ARCHIVAL_MONTH $ARCHIVAL_DAY`
echo "Purge cutoff date is $PURGE_DATE"
ls -l $ARCHIVAL_DIR/$LOG_SUFFIX*|grep '^-'|awk '{print $9}'|while read file
do
# echo $file
file_name=`basename "$file"`
FILE_DATE=`expr substr $file_name 9 10`
# echo "FILE_DATE date is $FILE_DATE"
_compare_2_date $FILE_DATE $PURGE_DATE
if [ "$can_archive" = "true" ];then
echo "archive file [$file_name]"
rm -f $ARCHIVAL_DIR/$file_name
if [ $? -eq 0 ]; then
TOTAL_FILE=`expr $TOTAL_FILE + 1`
else
echo "Purge log job failed at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 1
fi
fi
done
echo "Total purge $TOTAL_FILE log files"
echo "Purge log job finished successfully at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 0
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net