unix shell

unix shell

Unix shell,通常被稱作“命令行”,為Unix和類Unix作業系統提供了傳統的用戶界面。用戶通過輸入shell所執行的命令,引導計算機的操作。在微軟Windows作業系統平台,類似程式是command.com,或者基於Windows NT核心作業系統的cmd.exe。

Unixshell

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腳本

Unix命令

關於檔案/目錄處理的命令

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

相關詞條

相關搜尋

熱門詞條

聯絡我們