免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1127 | 回复: 0
打印 上一主题 下一主题

[SCO UNIX] Exit / Tar 命令详解[转] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-21 17:18 |只看该作者 |倒序浏览
exit指令

嚴謹的思考,是撰寫 shell script 該有的態度。當然她也是做好一件事情的基礎條件。現在,讓我們來認識一個在 shell 交談模式下,可能極少使用的內建指令 exit。

先看看 bash 交談模式下靜默工作的她的身影

[Farmer_Akira@www]# ls *
cl-aplog cl-aplog2 cl-aplog

[Farmer_Akira@www]# echo $?
0 #上個指令的"exit 狀態值"為 0 表示執行"成功"

[Farmer_Akira@www]# ls a*
ls: a*: No such file or directory

[Farmer_Akira@www]# echo $?
1 #上個指令的"exit 狀態值"為 1 表示執行"失敗"


你已經看到,要顯示上一個指令的"exit 狀態",只需用 echo $? 就可以了。顯示值為"0"表示指令成功執行,顯示值為"1"表示指令執行失敗。我相信這很容易理解。(好奇寶寶想 c shell 的情況,可參考這個連結)

一般來說,UNIX(linux) 系統的 process 以執行 system call exit() 來作為終結的。exit 呼叫的語法為

exit(status);

status 值回傳給 parent process,作為檢查 child process 執行狀態使用。

基於此撰寫結構慣例的延伸,shell 以內建指令 exit 來殷應這類寫法。語法非常簡單:

exit [n]

因為她的位元值只有 8-bits,所以 [n] 可用的數值範圍為 0-255 的整數。這就是她的遊戲規則。

通常,撰寫程式的人都會慎密地思考,程式可能面臨到的所以情況。所以讓我們來刻意地執行幾個她不支援的數值,看看她會如何回應。

[Farmer_Akira@www]# cat exit-n
#!/bin/bash
echo exit $1
exit $1


上頭,簡陋的 exit-n 是我為方便測試寫。功能很簡單,就是帶入 $1 到 exit 指令而已。讓我帶入大於 255 的整數以及非整數,來看看會得到什麼結果

[Farmer_Akira@www]# ./exit-n 256 ; echo $?
exit 256
0

[Farmer_Akira@www]# ./exit-n 257 ; echo $?
exit 257
1

[Farmer_Akira@www]# ./exit-n 258 ; echo $?
exit 258
2

[Farmer_Akira@www]# ./exit-n 511 ; echo $?
exit 511
255

[Farmer_Akira@www]# ./exit-n 2560 ; echo $?
exit 2560
0







可以清楚地看到,她對大於 255 的整數並不以"錯誤"處理,顯示的數值則有如里程表"歸零"後重新起跳一般。其實這個現象,不僅是大於的整數,連負數也有相同的現象

[Farmer_Akira@www]# ./exit-n -1 ; echo $?
exit -1
255

[Farmer_Akira@www]# ./exit-n -2 ; echo $?
exit-2
254

[Farmer_Akira@www]# ./exit-n -256 ; echo $?
exit -256
0


接著我帶入非整數看看

[Farmer_Akira@www]# ./exit-n 3.88 ; echo $?
exit 3.88
./exit-n: exit: bad non-numeric arg '3.88'
128

[Farmer_Akira@www]# ./exit-n 9.9999 ; echo $?
exit 9.9999
./exit-n: exit: bad non-numeric arg '9.9999'
128


得到相同的錯誤訊息,顯示值則同樣是 128。為何是 128,她是否有特別的涵義?事實上,答案是有,128 是 bash 保留定義的一個 exit status。這點其實也是我舉這些例子想為你說明的。

exit
狀態值 bash 已保留的定義說明
0 成功執行
1 一般性錯誤
2 指令不正確使用
126 指令無法執行
127 無法找到鍵入的指令
128 使用的 exit 指令數值有問題(不支援)
128+n fatal error signal "n"

關於最後一項 "128+n",這個特殊的狀態值時常出現在應用程式的異常中斷;譬如當 netscape 的執行程序被 kill -9 終止,netscape 會回應 fatal signal,這就是 n 值。bash 會自動加上 128,作為exit 狀態值。

[Farmer_Akira@www]# netscape
Killed
[Farmer_Akira@www]# echo $?
137


由於有這類的情況,所以在規範自己的 exit 狀態值時,126 ~ 128 以及 128 以上的數值儘量避免使用。因為 bash 也在使用她們。

建立 shell script 的 exit status 良好規範參考,莫過於採用 C 以及 C++ 語言的規範。檔案你可參考 /usr/include/sysexits.h。使用她們的好處是,除了省去再規範另一套的麻煩外,也可在撰寫shell script 的同時,有機會熟悉 C 以及 C++ 語言的規範。這對正在學習中的使用者,可說是一舉兩得的方法。

exit status 用在回傳 script 的退出狀態之外,也用在子函數中的退出狀態。對於 test 以及 trap 這兩個功能來說是時常用到的。這點我會在討論他們時做說明。這篇就寫到這裡了。

網路農夫 2002/02/25
2002/03/09 小幅修改




tar

tar 原字義是指"深色的焦油",一般也稱為瀝青或柏油。tar 原作者 Chuck Haley 用這個字來代表程式的功能,也就是將檔案粘在一起的意思。

在 Linux 中, tar 指令通常採用的是 GNU 撰寫的版本。使用的語法並必不特別但卻有一個特色,她能以選項的方式直接呼叫壓縮解壓縮程式,如 gzip(-z) 以及 compress(-Z)。這點倒提供了較合理的使用。因為原始的 tar 指令並沒有提供壓縮的功能。

如果列出 tar 全部的功能選項,是很壯觀的。因為 tar 是一個思考慎密的程式。對於檔案的製作、比對、新增、特殊保留項目、檢查、展開等動作都有功能選項,同時還針對以上狀況的例外做了特定額外的選項,所以第一次看她 on-line manual 的人,通常都會嚇一跳。其實在單機一般狀況下用的選項只要幾個就足以應付了。

常用功能選項

-c 製作 tar 檔案;create a new archive

-x 還原 tar 檔案;extract files from an archive

-t 顯示 tar 檔案的內容;list the contact of an archive

-v 顯示指令運作過程資訊;verbosely list files processed

-f 包含指定目錄下的子目錄以及所有檔案;

-z 呼叫 gzip 壓縮(製作檔案時)或解壓縮(還原檔案時)。

實例

# tar cvfz Ak2k202.tar.gz /home/html

以上是將 /home/html 目錄之下的所有資料壓縮轉存成 Ak2k202.tar.gz 檔案。

# tar xvfz game.tar.gz

將 game.tar.gz 檔案,解壓縮、解 tar 到在現在的目錄中。

# tar tvfz Ak2k201.tar.gz

顯示 Ak2k201.tar.gz 檔案的內容,通常我用這方式來查看一個檔案是否完整或者是任何錯誤訊息在其中。

相關資訊

GNU tar - Table of Contents
http://www.gnu.org/manual/tar-1.12/tar.html

中文手冊計劃
http://www.cmpp.net/cman-htmls/man1/tar.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP