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 "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