GNU/Linux 基礎指令集 - 基商資處科

383
網路農夫自由共享文件 GNU/Linux 基礎指令集 (0.04 2004/05/18) (作者:網路農夫) 奶奶與這幾年自由

Transcript of GNU/Linux 基礎指令集 - 基商資處科

網路農夫自由共享文件

GNU/Linux 基礎指令集

(0.04 版 2004/05/18)

(作者:網路農夫)

奶奶與這幾年自由

前言…為什麼寫這份文件

前言…為什麼寫這份文件

過去,農夫個人有過一點 UNIX 與 BSD OS 的使用經驗。幾年前,因電腦硬體更換與架站需求,在衡量硬體與作

業的配合度、適用性及後繼支援考量的選擇下,我開始測試性地改用 GNU/Linux OS,從 RedHat 7.2 到如今的

RedHat 9.0。在探索的初期,除了線上說明文件與國外 GNU/Linxu 社群所撰寫的原文文件之外,我也開始留意網

路上中文自由文件。曾幾何時,我在某網站上看到這麼一段文字

"別指望台灣的電子書啦!!! 來大陸找吧....一大堆!!!"

這段文字,引發我深深地感嘆......我想,我沒有資格去報怨一件連自己亦毫無作為的事。所以,我開始一天一點地持

續撰寫這份文件。就這樣文件在自己抱持著一點希望下,一天一點地累積...因為,我期望有一天,這份文件能代為傳

達一點某些人的期望。

一點希望

我知道這僅是一份題材狹隘且沒有實體的電腦電子文件。只要您有需要也願意的話,您即可自由免費地透過網路或

拷貝取得。本人亦不要求任何人因取得這份文件而給予經濟上的實質回報。只有一點個人的期盼與請求...如果...我是

說如果..

如果您認同這份文件,甚至願意為此文件支付您所認同的金錢回報。懇請您將您的善意,捐獻給我們這個社會裡那

些沒有父母關愛的孩子。您的大愛能溫暖這個有點寒冷的社會。您的良行更得以以彰顯您的富足與尊貴。

網路農夫 2003/12/31

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 2

版權聲明

版權聲明

本文為自由共享文件,不提供任何明示或默示的保證。作者同意任何人在不違背 GNU Free Documentation License,

版本 1.1 或後繼版本規範下,對本文進行拷貝、傳播及修改等行為。任何型態的衍生物,必須註明文件來源

(http://www.europa.idv.tw 網路農夫)並保留本段版權聲明或引用 "GNU Free Documentation License"。

請將您對本文的 建議或回應 送到 [email protected] 。或使用 www.europa.idv.tw 網站的建議與回應網

頁。

Copyright © 2004, 2003 網路農夫 (黃天彥).

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 3

目錄

目錄

前言…為什麼寫這份文件........................................................................................................ 2 版權聲明.................................................................................................................................... 3 目錄............................................................................................................................................ 4 access........................................................................................................................................ 8 alias.........................................................................................................................................11 apropos.................................................................................................................................... 13 arch.......................................................................................................................................... 15 at.............................................................................................................................................. 16 autorun.................................................................................................................................... 20 basename.................................................................................................................................. 22 bg.............................................................................................................................................. 23 break........................................................................................................................................ 25 cal............................................................................................................................................ 28 cat............................................................................................................................................ 33 cd.............................................................................................................................................. 36 chage........................................................................................................................................ 39 chattr...................................................................................................................................... 41 chgrp........................................................................................................................................ 44 chmod........................................................................................................................................ 46 chown........................................................................................................................................ 49 chsh.......................................................................................................................................... 52 clear........................................................................................................................................ 55 cmp............................................................................................................................................ 56 col............................................................................................................................................ 58 colrm........................................................................................................................................ 61 comm.......................................................................................................................................... 63 compress.................................................................................................................................. 65 continue.................................................................................................................................. 67 cp.............................................................................................................................................. 71 crontab.................................................................................................................................... 78 csplit...................................................................................................................................... 80 cut............................................................................................................................................ 83 date.......................................................................................................................................... 87 df.............................................................................................................................................. 92 dir............................................................................................................................................ 96 dircolors.............................................................................................................................. 101

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 4

目錄

dirname ..................................................................................................................................108 dirs ........................................................................................................................................ 110 dos2unix ................................................................................................................................ 114 du ............................................................................................................................................ 116 echo ........................................................................................................................................ 119 eject ......................................................................................................................................123 eval ........................................................................................................................................126 exec ........................................................................................................................................128 exit ........................................................................................................................................130 export ....................................................................................................................................132 expr ........................................................................................................................................134 false ......................................................................................................................................141 fg ............................................................................................................................................142 file ........................................................................................................................................144 find ........................................................................................................................................147 fold ........................................................................................................................................161 free ........................................................................................................................................163 hash ........................................................................................................................................166 hashstat ................................................................................................................................168 head ........................................................................................................................................169 hostid ....................................................................................................................................171 hostname ................................................................................................................................172 id ............................................................................................................................................175 import ....................................................................................................................................177 jobs ........................................................................................................................................181 join ........................................................................................................................................183 kill ........................................................................................................................................187 last, lastb ..........................................................................................................................190 let ..........................................................................................................................................192 link ........................................................................................................................................193 ln ............................................................................................................................................195 logname ..................................................................................................................................200 look ........................................................................................................................................201 ls ............................................................................................................................................203 lsattr ....................................................................................................................................209 md5sum ....................................................................................................................................210 mesg ........................................................................................................................................212 mkdir ......................................................................................................................................213

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 5

目錄

mv............................................................................................................................................ 215 nice........................................................................................................................................ 218 nl............................................................................................................................................ 220 nohup...................................................................................................................................... 223 paste...................................................................................................................................... 224 popd........................................................................................................................................ 226 ps............................................................................................................................................ 228 pstree.................................................................................................................................... 236 pushd...................................................................................................................................... 238 pwd.......................................................................................................................................... 241 read........................................................................................................................................ 242 readonly................................................................................................................................ 247 rehash.................................................................................................................................... 249 repeat.................................................................................................................................... 250 return.................................................................................................................................... 251 rev.......................................................................................................................................... 253 rm............................................................................................................................................ 255 rmdir...................................................................................................................................... 260 sleep...................................................................................................................................... 263 slocate.................................................................................................................................. 264 source.................................................................................................................................... 266 split...................................................................................................................................... 268 stat........................................................................................................................................ 270 su............................................................................................................................................ 274 sum.......................................................................................................................................... 276 sync........................................................................................................................................ 277 tac.......................................................................................................................................... 278 tail........................................................................................................................................ 280 tar.......................................................................................................................................... 282 tee.......................................................................................................................................... 285 test........................................................................................................................................ 287 time........................................................................................................................................ 297 time (tcsh).......................................................................................................................... 302 times...................................................................................................................................... 304 top.......................................................................................................................................... 305 touch...................................................................................................................................... 310 tr............................................................................................................................................ 313 trap........................................................................................................................................ 319

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 6

目錄

tree ........................................................................................................................................322 type ........................................................................................................................................325 ulimit ....................................................................................................................................327 umask ......................................................................................................................................329 uname ......................................................................................................................................332 unhash ....................................................................................................................................333 unix2dos ................................................................................................................................334 unlink ....................................................................................................................................336 vdir ........................................................................................................................................337 vimtutor ................................................................................................................................341 w ..............................................................................................................................................365 wait ........................................................................................................................................368 wall ........................................................................................................................................369 wc ............................................................................................................................................370 whatis ....................................................................................................................................372 whereis ..................................................................................................................................373 who ..........................................................................................................................................377 whoami ....................................................................................................................................379 write ......................................................................................................................................380 yes ..........................................................................................................................................382 版本修正與堪誤 ....................................................................................................................383

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 7

access

access

使用語法

access -mode file

指令說明

這是一個比較常用於 shell script 的指令(至少,我個人如此)。access 的功能與 test 相似。

她使用 system call access(2) 偵測文件檔案的許可狀態。當指定偵測的對象是 symbolic link

時,他將會反推回 symbolic link 的原始檔案,並自動以原始檔案來作為偵測的對象。

mode 是指定檢測的權限值,只能使用字母 rwx 標示 (r - 讀, w - 寫, x - 執行)。可以同時偵

測一個以上的權限狀態。偵測條件成立,回應 0 (真);偵測條件不成立,則回應 1 (偽)。

以原 man page 的說法,access 與 test 兩者在一個以 Read-only 掛載的檔案系統上是有差異

的,但並沒有說明是什麼差異?農夫我手上已無多餘硬碟可供運用,因此目前尚不清楚這項差異。

如果看倌們剛好有這樣環境的話,不彷測看看其差異何在?

實例說明

先聲明一點,以下的例子,我的身分是一般使用者 webak

# ls -l

total 4

-rw-r--r-- 1 webak webak 1825 6 月 24 09:29 access.html

# access r access.html

# echo $?

0

以 access.html 檔案的使用權限,我偵測 r 讀取的權限,可以得到預料的狀態值 0 (真)。

接下來,我來刻意測測她沒有的 x 執行權限

# access x access.html

# echo $?

1

我也得到預料值 1 (偽)。接著,試試兩個權限看看

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 8

access

# access rx access.html

# echo $?

1

果然,也得到預料的失敗狀態值 1。

接著,農夫臨時建立一個 symbolic link 檔案來作測試。

# ln -s access.html access-1.html

# ls -l

total 4

lrwxrwxrwx 1 webak webak 11 6 月 24 09:30 access-1.html -> access.html

-rw-r--r-- 1 webak webak 1825 6 月 24 09:29 access.html

新建立的 symbolic link 檔案 access-1.html,權限全開。且讓我們來測看看這樣的表象下,是

否還另有真相

# access x access-1.html

# echo $?

1

果然,不出所料。access-1.hmtl 真實的權限,還是以其原連結檔案 access.html 的權限為依據。

發現一個小問題

這個指令,我以一般使用者的身份執行完全沒有問題,但,有一次,我以 root 的身份執行,卻

發現,只要同時指定一個 mode 以上,就會產生一個常規行的錯誤,在該回報狀態 1 時卻回報為

0。這點狀況在我的環境下,屢試不爽

[root@www test]# ls -l access.html

-rw-r--r-- 1 root root 1825 6 月 24 09:32 access.html

[root@www test]# access r access.html

[root@www test]# echo $?

0

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 9

access

[root@www test]# access x access.html

[root@www test]# echo $?

1

到目前為止都還正常。但以下這一項的結果出現問題了。

[root@www test]# access rx access.html

[root@www test]# echo $?

0

初步看來,這應該是個 bug,如果你使用的是與本文寫作相同的環境。那,請小心與注意這現象。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 10

alias

alias

指令語法

tcsh alias

設定語法 alias name 'command'

解除設定語法 unalias name

顯示設定語法 alias (顯示所有別名設定)

alias name (顯示 name 的別名設定)

bash alias

設定語法 alias name='command'

解除設定語法 unalias name

顯示設定語法 alias (顯示所有別名設定)

alias name (顯示 name 的別名設定)

指令說明

別名(aliases)是 Shell 的內建指令。除了古董級的 Bourne shell 沒有這項功能以外,csh, tcsh,

bash, ksh 都有支援 alias 功能。

alias 主要的功能是設定一個“小名”來取代常用的或複雜的指令組合。在應用上可說是最多

樣、方便的好功能。

一般來說,較為常用的 aliases 都會設定在 shell 的起始檔案。如 bash 的 .bashrc 或 tcsh

的 .tcshrc。如果您自己掌握起始檔案的執行設定的話,自己設個 .aliases 檔案,還集中管理

也是不錯的做法。

實例說明

bash 下的 alias

% alias vicsh='vi \!:1 ; chmod u+x \!:1'

% alias cd='cd \!*;set prompt = "\! <$cwd> "'

tcsh 下的 alias

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 11

alias

% alias vicsh 'vi \!:1 ; chmod u+x \!:1'

% alias cd 'cd \!*;set prompt = "\! <$cwd> "'

這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 12

apropos

apropos

指令語法

apropos keyword ...

指令說明

使用關鍵字以模糊比對的方式查詢 man 的檢索資料庫,然後將結果輸出。(指令 apropos 與

whatis,這兩者檢索相同的資料庫)

相關指令

whatis(1), man(1)

實例說明

# apropos who

at.allow [at] (5) - determine who can submit jobs via at or batch

at.deny [at] (5) - determine who can submit jobs via at or batch

fwhois [whois] (1) - query a whois or nicname database

w (1) - Show who is logged on and what they are doing

who (1) - show who is logged on

whoami (1) - print effective userid

whois (1) - query a whois or nicname database

whom (1) - report to whom a message would go

#

有時候,如果我們以每個關鍵字來查詢與之相關的系統指令時,在不確定的情況下,這個指令能

幫上不小的忙。

另一個和 apropos 指令功能相近的是 whatis 指令,在此順便舉的例子好了,如下

# whatis who

who (1) - show who is logged on

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 13

apropos

兩者在資料搜尋上的差異,在於 apropos 採用較為寬鬆的關鍵字符合條件,而 whatis 則只顯示

完全符合關鍵字的資料。

這篇,就簡單地寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 14

arch

arch

指令語法

arch

指令說明

arch 指令的作用,很單純就是顯示目前主機的硬體架構,如 "i386", "i486", "i586", "alpha",

"sparc", "arm", "m68k", "mips", "ppc" 等。

在指令群中使用 uname -m 也可得到相同資訊。

實例說明

看一下我苦命的主機

# arch

i686

#

在此順便悼念一下去年相繼陣亡的兩台 P4。默哀....

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 15

at

at

指令語法

at [ -V ] [ -q queue ] [ -f file ] [ -mldbv ] TIME

at -c job [ job... ]

atq [ -V ] [ -q queue ]

atrm [ -V ] job [ job... ]

batch [ -V ] [ -q queue ] [ -f file ] [ -mv ] [ TIME ]

指令說明

at 設定特定的時間,自動執行預定的指令

atq 顯示預定執行的工作佇列狀態(root 可顯示所有使用者的佇列工作狀態)

atrm 刪除指定的佇列工作項目(以 job number 指定)

batch 在系統的平均負載低於 0.8 情況下,允許執行指定的工作。(0.8 是 RedHat 的預設

值,高於或其他特定可使用 atrun 指令)

時間的指定,可以是 x 年 x月 x日 x時,也可以是 x 月或 x 週或 x 日的 x 時 x分,或者是從現

在算起的 x 天後 x 時 x分。語法拓展自 POSIX.2 規範,可做或彈性或精確的設定。(完整的時間

規範放在/usr/share/doc/at-3.1.8/timespec 檔案)

特定單字的規範有 NOW, AM, PM, NOON, MIDNIGHT, TEATIME, SUN, MON, TUE,

WED, THU FRI, SAT, TODAY, TOMORROW, NEXT, MINUTE, HOUR, DAY, WEEK, MONTH,

YEAR, JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, UTC。

其中較特殊的是 TEATIME,代表下午 4 點。其他的就如字義所示。

日期格式可以是以下其一

MM/DD/YY (月/日/年)

DD.MM.YY. (日.月.年.)

+DD (從當日算起的幾天後)

時間格式可以使用 AM, PM 或者是 24小 時制 HH:MM (時:分) 或者使用符號 +

來指定 x 時 x分後執行。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 16

at

範例:

at 4pm + 3day (三天後的下午 4點)

at 10am Jul 31 (7 月 31 日的早上 10 點)

at 1am tomorrow (明天的早上 1點)

關於時間,有一項不成文的法則,就是如果今日該時刻已過,自動變成"次日"

的時刻。

嚴格來說,這個指令族群對工作執行提供了相當程度的彈性與便利,但卻也為系統管理帶來了潛

在的安全問題。所以這個指令族群的使用權限最好加以管制。系統管理者可透過設定

/etc/at.allow 給予使用者執行權限或設定 /etc/at.deny 限制執行。當只有 /etc/at.allow 檔

案存在時,只有設定的使用者具有執行權限。如果 /etc/at.allow 不存在,則檢查 /etc/at.deny

檔案,拒絕該檔案所設定的使用者執行。如果兩者都不存在,則只有 root 擁有執行權限。一般

系統的預設值 /etc/at.deny 檔案內容是空的,這表示所有的使用者均可執行。

選項說明

-V

將程式的版本資訊將由 stderr 輸出顯示

-q queue

指定特定的工作佇列。預設的佇列 at 使用 queue a,而 batch 使用 queue b。合法的佇列有小

寫字母的 a 到 z 以及大寫的 A 到 Z。順序越後面的字母,其佇列執行的 nice 值越高,因此在

程序執行的優先就越低。

-m

將執行的訊息結果以電子郵件傳送給使用者

-f file

讀取指定的檔案(一般為可執行的 shell script)

-l

顯示佇列中的工作。使用 at -l 相當於 atq

-d

刪除佇列工作。使用 at -d 相當執行 atrm

-v

顯示佇列工作的執行時間。時間的格式如 "2003-05-04 13:30"。如果使用者設定了

POSIXLY_CORRECT 環境變數,則時間格式為"Sun May 4 13:30:00 2003"。(在 RedHat 9.0 中這

個選項已成無效選項, 因為需設定 POSIXLY_CORRECT 環境變數,顯示的時間格式就是 -v 選項的

效果了)

-c

將工做的指令列重導向到標準輸出(在 RedHat 9.0 以不支援此選項)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 17

at

at 或 batch 可以從標準輸入或者用 -f 選項指定 shell script 執行。這兩者其程序執行的工

作環境,除了 TERM、 DISPLAY 這兩項外,其他的環境變數如 PATH, umask 等基本上不會變動。

但有一個情況較為特殊,假定使用者以 userA 的帳戶簽入系統,又使用 su 變化成 userB,然後

執行 at 或 batch。在這種情況下,at 或 batch 執行程序的 USER 將會是 userB,但 -m 選項

mail 的收件者將會是 userA。

相關檔案

/var/spool/at (存放 job file 的地方)

/var/spool/at/spool

/proc/loadavg

/var/run/utmp

/etc/at.allow (管理允許使用 at 指令的使用者設定檔)

/etc/at.deny (設定不允許使用 at 指令的使用者)

相關延伸指令

cron(1), nice(1), sh(1), umask(2), atd(8)

目前存在的問題

在 Linux 中,程式現階段需與系統 /proc 其中的一個 proc- 型態目錄相依存。

當 /var/run/utmp 檔案毀損或不存在,或使用者在指令執行時間沒有登錄,郵件將會傳送到環境

變數 LOGNAME 所對應的 userid。假使該變數沒有定義或內容為空,則既會被當前的 userid 冒

替之。

如果想避免上述的狀況,建議改用其他的 batch 系統,譬如 nqs。

實例

確定 daemon atd 啟動

系統是否支援這個指令,要看是否安裝以及啟動 atd 這個 daemon 而定。我們可以使用 ps 以及

grep 來知道是否有 atd daemon 的程序在執行。

# ps axu |grep atd

daemon 936 0.0 0.0 1412 180 ? S Aug10 0:00 [atd]

root 2927 0.0 0.1 4444 644 pts/2 S 13:12 0:00 grep atd

如果 grep atd 發現沒有任何 daemon process 的話,必須先啟動 atd。指令 at 才能順利運作。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 18

at

以下是一個簡單的使用實例

# at -f /home/akk/akbin/w3backup 3am tomorrow

warning: commands will be executed using (in order) a) $SHELL b) login shell

c) /bin/sh job 4 at 2003-08-13 03:00

#

使用 -f 選項時,農夫個人習慣,也建議最好使用 full path。

# atq

4 2003-08-13 03:00 a root

#

使用 atq 可以清楚地看到 queue 的狀態。其格式依序是 "工作 id", "執行時間", "使用者名稱"

# atrm 4

# at -l

#

如果想放棄執行的話,使用 atrm 指定 "工作 id" 即可。這篇就寫簡單地寫到。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 19

autorun

autorun

指令語法

autorun [-lmqv?V] [-a EXEC] [-c CDPLAYER] [-e STRING] [-i MILLISEC] [-n STRING] [-t

STRING] [--autorun=EXEC] [--cdplayer=CDPLAYER] [--interval=MILLISEC] [--lock] [--mountonly]

[--notify=STRING] [--notify-insert=STRING] [--notify-eject=STRING] [--quiet] [--verbose] [--help]

[--usage] [--version] [cdromdevices...]

指令說明

autorun 指令,可自動識別系統上所有支援的的 CDROMs,在插入 CD 時裝掛她們,並執行 CD 上

可能包含的 'autorun' 可執行檔案。要讓一般使用者使用這項功能,必須在 /etc/fstab 中在想

要使用的 CDROMs 項目中加入選項 user,exec。

你可以在 KDE 中使用 Autorun.kdelnk。只要把她放到你的 Autostart 文件夾中即可。

選項說明

-a, --autorun=EXEC

當 CD 更換,執行 EXEC。該執行檔案必須在 CD 片上。如使用 "--autorun=myprogram",而 CD 掛

在 /mnt/cdrom 下。當 CD 換片,指令會嚐試執行 "/mnt/cdrom/myprogram"。(預設值為

"/autorun")

-c, --cdplayer=CDPLAYER

執行 CDPLAYER。當你插入音樂 CD。(default "/usr/bin/kscd")

-i, --interval=MILLISEC

檢查間格時間 MILLISEC。(預設值 1000)

-l, --lock

鎖定裝掛的裝置。(必須使用手動卸載)

-m, --mountonly

只裝掛或卸載。(不自動執行任何程式)

-n, --notify=STRING

當 CD 換片,執行 STRING。(預設值 "/usr/bin/kfmclient configureDesktop")

-t, --notify-insert=STRING

當置入 CD 片,執行 STRING,而 "/autorun" 以及 --autorun 選項的指定將被忽略。(預設值

"/usr/bin/kfmclient openURL %P%")

-e, --notify-eject=STRING

當取出 CD 片,執行 STRING。(預設值 "")

-q, --quiet

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 20

autorun

不產生任何輸出。

-v, --verbose

輸出顯示

-?, --help,

顯示幫助訊息。

--usage

顯示使用簡訊。

-V, --version

顯示程式版本

實例說明

以上寫了一堆選項,但我只這樣用

# autorun

新兵報告完畢。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 21

basename

basename

指令語法

basename NAME [SUFFIX]

basename OPTION

指令說明

指令的作用在於取得你輸入路徑的最尾端部分。相當於移除路徑,保留檔名。這種作用在撰寫

shell script 時較常用,交談環境下運用的時機相當少。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

# basename /home/john

john

basename 保留輸入資料的尾部。另一個互補性的指令 dirname,則保留 basename 捨棄的部分。

# dirname /home/john

/home

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 22

bg

bg

指令語法

bash

bg [jobspec]

tcsh

bg [%job ...]

指令說明

在 shell 交談模式下,我們可以使用 Ctrl-z 中止一個正在執行中的指令或工作。這個被 Ctrl-z

中止的程序,會被 shell 丟到背景工作中乖乖地等待我們再次去叫醒她。當我們想要叫醒這些被

放到背景中的睡美人時,bg 這個青蛙王子的吻,就派上用場了。

關於 bg 的基礎使用,bash 與 tcsh 大體上相同。

實例說明

bash 例子

下例是我先後用 Ctrl-z 的方式將兩個指令放到背景工作中

# jobs

[1]- Stopped top -n 500 | tee Ps_A

[2]+ Stopped netstat -ct

#

使用 jobs 指令讓我們知道,目前背景工作中的狀態。我們可清楚看到,那兩道指令,被停在背

景工作中...當我們想叫醒 1 號睡美人,就用 bg 這支大嘴巴青蛙去吻 1 號,就可以啦

$ bg 1

[1]- top -n 500 | tee Ps_A &

$

用 bg 叫醒的背景工作,仍舊是待在背景工作中,不會被置換到前景來。要置換背景工作到前景

是 fg 的工作。

tcsh 例子

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 23

bg

以下這部分的動作,與我在 bash 中做法相同

$ jobs

[1] - Suspended (signal) top -s -n 300 |

Suspended tee fileA

[2] + Suspended netstat -ct

$

接下來,我們的請 tcsh 的青蛙王子上場了...優....兩個睡美人.....主人,看老蛙我一次解

決...

$ bg %1 %2

[2] netstat -ct &

[1] top -s -n 300 | tee fileA &

嗯〜嗯〜,嘿嘿!!兩個都醒了。

在這裡提醒看倌們,tcsh 的老蛙,只要你喜歡,一次可以叫醒 n 個背景工作;但牛伯伯的青蛙

王子,比較含蓄,一次只能一個...所以,薑還是老的辣...但請小心使用,一次太多個,螢幕是

會打架的。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 24

break

break

指令語法

bash

break [n]

tcsh

break

指令說明

基本上 bash 與 tcsh 都有內建的 break 指令,其作用相同就是退出當前的執行迴圈。以下是她

們各自的功能說明。

bash

在 bash 環境下,內建指令 break 可使用在 for, while, until 與 select 等迴圈類型。指令

可帶入一個 n 值,退出 n 層迴圈的意思。此 n 值必須 大於或等於 1。當帶入的 n 大於實際的

迴圈層數,則退出所有迴圈。

tcsh

在 bash 環境下,內建指令 break 可使用在 foreach 及 while 這兩種迴圈類型。

實例說明

bash

以下的例子是單純為介紹使用語法而寫的,請不要太在意例子本身的作用。

# cat breakb01

#!/bin/bash

NUMLIM=19

a=0

while [ "$a" -le "$NUMLIM" ]

do

a=$(($a+2))

if [ "$a" -gt 10 ]

then

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 25

break

echo break

break

fi

echo -n "$a "

done

exit 0

#

上例是單層迴圈例子。在 while 的迴圈中,藉由條件判斷來使用 break 退出迴圈的執行。接下

來我們來看個雙層迴圈的例子

# cat breakb02

#!/bin/bash

for loopA in 2 4 6 8 10

do

echo -n "loopA $loopA, "

for loopB in 2 4 6 8 10

do

echo -n "loopB $loopB, "

if [ "$loopB" -eq 4 ]

then

break

fi

done

echo "loopB -end"

done

echo "loopA -end"

exit 0

#

雙層的 for 帶入 2, 4, 6, 8, 10 數值。在第二層的 for 做條件判斷,如果帶入的數值等於 4,

則 break,也就是退出當前執行的迴圈,因此會退出 loopB 回到 loopA 的迴圈中。繼續迴圈的

執行。以下是執行的情況

# breakb02

loopA 2, loopB 2, loopB 4, loopB -end

loopA 4 loopB 2 loopB 4 loopB -end

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 26

break

loopA 6, loopB 2, loopB 4, loopB -end

loopA 8, loopB 2, loopB 4, loopB -end

loopA 10, loopB 2, loopB 4, loopB -end

loopA -end

#

如果想退出兩層迴圈只需將 break 修改成 break 2 即可。以下是修改後的執行結果

# breakb02

loopA 2, loopB 2, loopB 4, loopA -end

#

tcsh

以下是一個單純的 while 迴圈中,使用 break 退出迴圈的情況

# cat breakt01

#!/bin/tcsh

@ a = 1

@ line =20

while ($a != $line)

if ("$a" == 5) break

echo -n "$a, "

@ a++

end

echo ""

#

使用 if 來做條件判斷,當成立時 break 退出迴圈,以下是執行狀況

# breakt01

1, 2, 3, 4,

#

一如預計,當 a 為 5 時,迴圈執行便被 break 終止了。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 27

cal

cal

指令語法

cal [-mjy13 ] [[ month ] year ]

指令說明

顯示指定的月曆資料。未作任何指定則顯示當月月曆

選項說明

-1 :顯示單月份月曆

-3 :顯示 上月份/當月份/下月份 的月曆

-m :以"週一"為星期的開始(預設值為週日)

-j :顯示太陽日(1,2,3....365,366)

-y :顯示整年份月曆

單組數字 (1~9999) 時,顯示該數字的完整年份月曆資料。

雙組數字 (1-12) (1-9999),第一組為月份,第二組為年份,指令會顯示指定

的月曆資料。

實例說明

這是個 Linux 環境中文化後,我個人看得最難過的指令....

# cal 10 2002

十月 2002

週日 週一 週二 週三 週四 週五 週六

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 28

cal

#

這麼不協調的畫面,電腦要是長眼睛的話,肯定當機自殺。如果你跟我一樣,無法忍受這種畫面,

想換回英文顯示。需要的只是重調整 LC_MESSAGES 這個環境變數就夠了,設定的語法因 shell 而

異。

tcsh 環境的作法如下

$ setenv LC_MESSAGES en.US.ISO-8859-1

我個人,用的是 bash,作法如下

# LC_MESSAGES=en.US.ISO-8859-1

# export LC_MESSAGES

設定好以後,再執行 cal 看看顯示結果

# cal

October 2002

Su Mo Tu We Th Fr Sa

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

#

很好,回復正常的英文顯示,看起來也舒服多了。

不過,這樣手動調整環境變數的作法,不但煩,而且還有後遺症。就是想要中文環境時,還得手

動調回去。這顯然是個癡呆的作法,如果你的電腦知道你這樣做,他一定會把你電死,然後再自

殺。

所以在此,農夫我提供一個讓人與電腦都能繼續活下去的方法...用 script 來做,我命名為

akcal。只有四行,如下所示

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 29

cal

# cat -n akcal

1 #!/bin/bash

2 LC_MESSAGES=en.US.ISO-8859-1

3 export LC_MESSAGES

4 cal $1 $2 $3

#

由於執行 script 是以 subshell 的方式進行,所以不會有原來的環境設定。

一週的開始 -- 到底那天,才是一個星期的開始?

這個問題,如果你跑到菜市場去問買菜的歐巴桑或歐泥桑們,只要你問的人數夠多,就可能會出

現九個答案....其中,比較普遍回答的是星期天,星期一,不知道跟神經病。答星期一的,通常

不知道為什麼。答星期天的還能有幾個說得上原因,說不知道的人通常表情比較和善,罵你神經

病的,通常好面子輸不起,回答星期二到星期六的,你可就得提高警覺,小心"它"靠近你.....

其實這和你信不信耶穌有關,在全世界最長壽的暢銷書裡記載,耶穌被人釘死在十字架後的第三

天復活,那一天就剛好是上帝創世後的休息紀念日--星期天。所以信奉上帝及耶穌的人稱星期天

為"主日",信徒們都會在這一天放下工作,走進教堂一起卡拉 OK。因此,他們以這一天為一週的

開始。

.....這些人下 cal 指令比較方便(因此,寫這個指令的作者,極可能是個宗教狂熱份子)....直

接打 cal 就夠了

# cal

October 2002

Su Mo Tu We Th Fr Sa

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

當然,全世界這麼多人種,可不是人人都信這一套。譬如,一個星期七天的使用,可追溯到遠古

的巴比倫,當時是以日、月及金、木、水、火、土等行星來輪流代表每日。這個名稱與順序演變

成現今,各國在名稱上已經有自己的習慣用法,但一個星期七天確仍舊保留。像我們很省事地使

用數字,星期一,二,三,四,五,六,日來作代表。日本則全部沿用(日曜日、月曜日、金曜日、

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 30

cal

木曜日、水曜日、火曜日、土曜日)。至於大部分的非宗教國家或地區,則習慣以星期一做為一週

的開始。

這些人,下 cal 指令就比較麻煩,得加 -m 選項

# cal -m

October 2002

Mo Tu We Th Fr Sa Su

1 2 3 4 5 6

7 8 9 10 11 12 13

14 15 16 17 18 19 20

21 22 23 24 25 26 27

28 29 30 31

#

但其實有極少部份的自然人,在山裡過著梭羅式的自然天然生活,一週七天,天天星期天.....所

以這種人的 cal 指令大都是這個下法

# cat -n akcal

1 #!/bin/bash

2 LC_MESSAGES=en.US.ISO-8859-1

3 export LC_MESSAGES

4 cal $1 $2 $3 | sed -e "s/Mo Tu We Th Fr Sa/Su Su Su Su Su Su/g"

# akcal -3 10 2002

September 2002 October 2002 November 2002

Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su Su

1 2 3 4 5 6 7 1 2 3 4 5 1 2

8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9

15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16

22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23

29 30 27 28 29 30 31 24 25 26 27 28 29 30

#

這種顯示是農夫式的系統預設值。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 31

cal

1752 年 9 月的怪月曆

# cal -m 09 1752

September 1752

Mo Tu We Th Fr Sa Su

1 2 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30

cal 指令源自美國 AT&T 的 UNIX,也因此繼承了美國的歷史。時間回到 1752 年。當年,美國尚

未獨立,仍舊屬英國的殖民地。英國的曆制在那一年作了重大的修正,9月 2 日的隔天變成了 9

月 14 日。也因此日後的美國在追尋歷史時間時,有了這麼一頁。

關餘曆法時間的修正可追朔到 16 世紀羅馬教皇格利戈里八世在位時。當時有人發現,曆法時間

較實際的天體運轉每年快了 11 分 14 秒,累計的誤差已到達 10 天了。如果再繼續錯下去復活節

恐怕就失去時間的意義了,所以教皇授命成立委員會進行修正的方案研究。最後在 1582年 2月 24

日,教皇頒布修正做法,1582 年 10 月 4 日夜晚結束後,隔天的出現的太陽算 10 月 15 日。於是

1582 年 10 月 5 日到 14 日就這樣憑空從歷史中消逝。那一年有好多人沒過到生日(老婦女歡呼,

小孩哭泣,糕餅業者逃亡)..在這項修正後,各天主教國也後陸續修正。唯獨大英帝國..足足慢了

將近兩百年..

這篇暫時寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 32

cat

cat

指令語法

cat [OPTION] [FILE]...

指令說明

連結檔案內容到標準輸出。檔案的數量可指定一個以上。

選項說明

-A, --show-all

功能等於 -vET 選項的組合

-b, --number-nonblank

顯示行碼,但沒有內容的空行不予計算

-e

功能等於 -vE 選項的組合

-E, --show-ends

在每行行末顯示 "$" 符號

-n, --number

顯示每行的行碼數(白話叫"第幾行")

-s, --squeeze-blank

將超過一行以上的空白,縮減成以一行空白行顯示

-t

功能等於 -vT 選項的組合

-T, --show-tabs

用符號 "^I" 來取代 TAB 字元的顯示

-v, --show-nonprinting

除了 LFD 與 TAB 外的控制字元,均以"^"或"M-"符號來顯示

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

指令會在你不指定檔案名稱或使用"-"符號等的情況下,轉為讀取標準輸入。

實例說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 33

cat

顯示檔案的內容

善用 cat 這個常用指令,可以讓使用者更能掌握一個文字檔案。讓我們來看一個例子

# cat exp-01

aksoft

bin

dict

etc

games

#

上例是一般常用的 cat 下法。有時候這樣的顯示並不足夠。譬如在上例中空格字元以及跳格字元

都無法顯現,所以每行結束的位置是無法得知。所以嚴格地說,你看的空白行,不見得是完全空

白的。

所以我時常建議這種情況下加上 -E 以及 -n 這兩個選項,因為不用多花錢,所以不加就是損

失...

# cat -En exp-01

1 aksoft $

2 bin$

3 $

4 $

5 dict$

6 etc$

7 $

8 $

9 games$

#

加上選項後的顯示,不但每行加上行號,而且結束位置一清二楚。

迅速地縮減連續空白行

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 34

cat

當你碰到檔案中夾雜了許多連續的空白行時,提供你一個簡便的方法,來去除他們,作法是用 cat

加上 -s 選項來過濾連續的空行

# cat -s exp-02 > exp-02b

# wc -l exp-02 exp-02b

338 exp-02

249 exp-02b

587 總計

#

處理過後的 exp-02b 檔案只剩 249 行,原先的 exp-02 檔案則有 338 行。少掉的就是沒有必要

的空行。

合併檔案

這個蠻常用到方法,做的簡單文字檔案頭尾相接的合併。

# cat exp-01 exp-02 exp-03 > exp-04

當然這時候,我們也可以順便加上 -s 選項,刪除不必要的空行。

# cat -s exp-01 exp-02 exp-03 > exp-04

這篇就先簡單的寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 35

cd

cd

指令語法

bash -- cd [-LP] [dir]

tcsh -- cd [-p] [-l] [-n|-v] [name]

指令說明與實例

以現況來說,cd 是 shell 的內建指令。bash, csh, tcsh 等 unix/linux shell 均在程式內建

這個指令。所以你使用那種 shell,你就是使用她內建的 cd 指令。

從功能來看,各個 shell 所內建的 cd 指令,共通性相當大,很難感覺到差異。以下,我將以 bash

來作為預定環境,有差異時我會加註說明。

cd 指令的使用法則很簡單。下指令時,如果不給任何目錄名稱,工作目錄會自動回到使用者的

home 目錄。這點與符號"~"的使用是相同的。

# cd

# cd ~

想到那位使用者的 home 目錄,可以使用符號 ~username 來表示。

# cd ~root

# cd ~akira

當然擁有適當的拜訪權限,還是必要的。如果指定的使用者不存在,或者是目錄不存在,指令就

不做目錄的更動,保持在原工作目錄。

指定目錄的方式,可以使用"相對路徑",也可以使用"絕對路徑"。

# cd ../../etc

# cd /etc

上述,差不多就是 cd 指令基本運用了。接下來介紹一個賦予 cd 特異功能的 shell 變數。

bash 環境變數 --$CDPATH

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 36

cd

這個專為 cd 指令而生的環境變數,作用其實與 $PATH 極為相似。設定 CDPATH 的目的,在於建

立一個 hash table 用來當成是 cd 指令的關鍵字搜尋,就有如指令的執行,不需使用者鍵入"絕

對路徑",僅需鍵入關鍵字一般。

設定 $CDPATH 內容的方法是,給予變數一串搜尋目錄的"絕對路徑",在兩者之間需使用符號":"

加以連接,不需也不可使用空白鍵來做區隔。

通常這個環境變數都是設定在 ".bashrc" 或者是 ".bash_profile" 等起始檔案裡面。當然也可

以臨時以手動設定,以下為了舉例,我在指令模下進行設定

# CDPATH=/home/w2002:/etc/httpd:/var/log

# cd htmlhome

/home/w2002/htmlhome

# cd logs

/etc/httpd/logs

#

如果你覺得有必要設定在你的 ".bashrc" 或者是 ".bash_profile" 中。別忘了設定變數之後,

還得使用 export CDPATH 變數

CDPATH=/home/w2002:/etc/httpd:/var/log

export CDPATH

csh, tcsh 相同的變數是小寫的 cdpath 變數,其做法,請參考此連結。

選項與實例說明

-P (bash) , -p (tcsh) :變換工作目錄到指定連結目錄(symbolic links)的實體路徑 (physical

directory)

# ls -l /2002w3/httpd/logs

lrwxrwxrwx 1 root root 19 5 月 14 10:11 /2002w3/httpd/logs -> ../../var/log/httpd

# cd -P /2002w3/httpd/logs

# pwd

/var/log/httpd

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 37

cd

在上例中,我雖然是以 cd 指令"跳"到 /2002w3/httpd/logs 目錄,但實際上因為我加上了 -P 選

項,所以,在發現這個目錄是連結目錄後,她就直接再"跳"到連結的實體目錄,所以,真正最後

的工作目錄是到 /var/log/httpd。這個選項有一個極大的用處,當我想 shell script 中做到清

除實體目錄時,她提供了相當大的便利。

"cd -" (bash, tcsh 用法相同) :迅速來回在兩個工作目錄之間

# cd /etc/httpd/logs

# cd /var/log

# cd -

/etc/httpd/logs

# cd -

/var/log

#

上例,簡單地重複使用 "cd -",讓我輕鬆、迅速地,在兩個工作目錄之間遊走。

好了,這個簡單的 cd 指令,就寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 38

chage

chage

指令語法

chage

[-m mindays] [-M maxdays] [-d lastday] [-I inactive]

[-E expiredate] [-W warndays] user

chage

-l user

指令說明

管理者為了系統安全考量,會強制執行帳戶定期變更密碼的動作。這算是蠻正規的系統帳戶管理。

嚴格說來,chage 已經算是個管理性質的指令了。因為,一般使用者大概在正常使用上,不太需

要用到這個指令。

還有,chage 指令必須配合系統啟用 shadow 才可正常工作。這點應該不需要擔心,以目前的

linux 系統,預設環境都有啟用 shadow 來存放帳戶密碼。而且,chage 也正好是 shadow-utils

rpm 程式包當中的一員。

選項說明

-m mindays

設定使用者必須要更改密碼的最短天數。如果數值為 0,表示密碼永不過期。

-M maxdays

指定密碼最長的有效天數。如此選項所指定的天數加上 -d 選項所指定的天數少於目前的天數(從

1970 年 1 月 1日開始計算),使用者必須立即更改密碼,才可正常登錄系統。

-d lastday

指定上次更改密碼的天數(格式 YYYY-MM-DD,從 1970 年 1 月 1日開始計算)。

-I inactive

指定在密碼過期後與帳號被鎖定前的天數,假如指定數值為 0 的話,在密碼過期後,帳號將不會

被鎖定。

-E expiredate

指定要鎖定帳號的日期(以 YYYY-MM-DD 格式),如不指定日期,也可使用從 1970 年 1 月 1日起

計算的天數。

-W warndays

指定密碼過期前要警告使用者的天數。

相關檔案

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 39

chage

/etc/passwd (帳戶基本訊息,不包含密碼)

/etc/shadow (帳戶訊息,包含密碼)

實例說明

問答設定

管理者可以使用最簡單的問題方式,對某使用者做必要的帳戶安全設定

# chage john

Changing the aging information for john

Enter the new value, or press ENTER for the default

Minimum Password Age [-1]:

Maximum Password Age [99999]:

Last Password Change (YYYY-MM-DD) [2003-12-10]: 2004-01-01

Password Expiration Warning [-1]: 10

Password Inactive [-1]:

Account Expiration Date (YYYY-MM-DD) [1969-12-31]: 2004-10-21

#

強迫使用者密碼過期

# chage -d 0 john

以上是系統管理者(root)以 chage 指令讓使用者(john)的密碼便成過期的狀態。使用者 john 下

回登錄到系統時,將會收到系統提出的警告訊息,並要求該更改密碼。

設定帳戶密碼有效期限

# chage -m 30 john

將 john 的密碼有效期設定為 30 天。這可迫使 john 一個月換一次帳戶密碼。

這篇先簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 40

chattr

chattr

指令語法

chattr [ -RV ] [ -v version ] +-=[ASacdistu] files...

指令說明

對系統使用者來說,ext2fs 檔案系統提供了額外的檔案權限,這些檔案系統特有的屬性,有別於

傳承自 UNIX 系統的檔案權限思維,這是設定前必須清楚的概念。

這些特有的檔案屬性,可以說是補強了原先 read (r), write (w), execute (e) 的組合強度。

因此倘若想做到更好的安全掌控,認知這些屬性就顯得相對重要,也必要了。

chattr 支援對 ext2fs(EXTended 2 FileSystem) 中的檔案或目錄做專屬的檔案屬性設定及修改。

符號模式為 +-=[ASacdistu] 組合

+ 增加指定的屬性

- 去掉指定的屬性

= 等於指定的屬性

ASacdisu 為屬性的選項:不更新 atime(A),同步更新(S),只能添加(a),壓

縮(c),不可變(i),不可轉移(d),保密性刪除(s),不可刪除(u)。

選項說明

-R

遞迴處理指定的目錄(連同子目錄),本模式對於符號連結的資料不做處理。

-V

顯示詳盡地給出 chattr 的輸出信息並打印出程序的版本. Be verbose with chattr's output and

print the program version.

-v version

設置文件的版本。

屬性說明

指令可改變存的 ext2 檔案系統屬性,目前有八種模式。以下是簡單的說明:

a (append only)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 41

chattr

僅允對檔案添加資料寫入,不可直接進行編輯寫入,無法更改與刪除。此屬性僅供管理者設定與

清除。

A (no Access time)

不更新檔案或目錄的最後存取時間(atime)。這項設定可減少磁碟存取的次數。對攜帶式筆記型電

腦有節約耗電量的效果。當一個檔案或目錄設定了這個屬性,無論在何時被讀取或寫入,最後存

取時間(atime)都不會變動。這對於一些經常被讀取的檔案,可減少磁碟存取的次數,這對攜帶

式筆記型電腦可節約耗電量。

c (compressed)

設定此屬性的檔案或目錄,會自動壓縮後再存放到硬碟,讀取資料時則會自動做解壓縮的動作。

d (no dump)

將檔案或目錄排除在 dump 備份作業之外。dump 是系統的備份工具。當檔案或目錄被設定這個屬

性後,dump 作業時會自動排除備份。但請注意目錄設定這屬性時其下之檔案及子目錄皆受影響。

i (immutable)

無法任意更動檔案或目錄。設定此項屬性,可使檔案或目錄無法刪除、更改名稱、編輯修改,甚

至無法連結。此屬性僅供管理者設定與清除。

s (secure deletion)

保密性刪除檔案或目錄。設定此項屬性,在刪除時,系統會用"00"(16 進位字碼)字元填滿原來

的資料區塊,徹底破壞資料,達到保密目的。

S (Synchronous mode)

立即更新檔案或目錄。一般性的資料寫入,系統會先把資料填入緩衝區(buffer)內。但設定此

屬性的檔案或目錄,資料異動將會直接寫入硬碟。

u (undeletable)

預防意外刪除。有此屬性的檔案或目錄被刪除時,其內容仍會被另行保存。可讓使用者還有機會

救回刪除的資料。

相關指令

lsattr(1)

實例說明

善用 A (no Access time) 屬性,減輕磁碟負載

# chattr -R +A /home/webhome

上例,是將 /home/webhome 整個目錄(包含子目錄),設定 A 屬性。

這項設定除了前述對於筆記型電腦的電源耗用有幫助外,對於網站資料,也非常設合。由於這類

資料屬公開性質,被讀取次數也相當頻繁,紀錄檔案被讀取的時間,反而便成了一項不具意義的

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 42

chattr

舉動。倒不如設定這項屬性,讓硬碟 I/O 的負載減量,得到更實質與正面的效益。此外,一些紀

錄性的 log 檔案,像 apache 的 log 檔案也適合做這項設定。

善用 i (immutable) 屬性,建構更合理的檔案安全

# chattr +i /etc/inetd.conf

有些重要的設定檔案,是我們設定好後,就不太會去更動,也不希望被人更動的。這類的文件,

就適合做 i 屬性設定。

善用 s (secure deletion) 屬性,建構安全隱私

# chattr +s ego.txt

有些檔案具個人隱私性資料。最好能自己動手加上 s 屬性。

注意:檔案複製的屬性繼承性

目前,如果我們在系統中使用 cp 指令來複製一些設定有 ext2fs 特有檔案屬性的檔案或目錄,

你將會發現,新建立的目的檔,不一定會繼承原有的屬性設定。

這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 43

chgrp

chgrp

指令語法

chgrp [OPTION]... GROUP FILE...

指令說明

變更檔案的所屬群組。

選項說明

-c, --changes

顯示以確定更改的資訊

--dereference

當指定的檔案型態是 symbolic link 時, 主動將變更的檔案指向 symbolic link 檔案的實體檔

-h, --no-dereference

當指定的檔案型態是 symbolic link 時, 只變更該 symbolic link 檔案本身,不變更 symbolic

link 檔案的實體檔案

-f, --silent, --quiet

不顯示錯誤訊息(大部分)

-R, --recursive

變更目錄,包含其下所有資料

-v, --verbose

顯示工作程序

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

# ls -l

total 4

-rw-rw-r-- 1 akira akira 1608 6 月 30 11:19 group-5.html

# chgrp farmer group-5.html

# ls -l

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 44

chgrp

total 4

-rw-rw-r-- 1 akira farmer 1608 6 月 30 11:19 group-5.html

#

這個指令提供 root 自由變換任意檔案到已存在的任意群組,但僅提供一般使用者變更自已擁有

的檔案到合法的群組。

這篇,就簡單地寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 45

chmod

chmod

指令說明

這個指令無法用於修改 symbolic links 的任何權限設定。指令變更權限的形式有兩種,符號形

式或數字形式

符號形式:

chmod [選項] [ugoa][+-=][rwxXstugo...] 檔案名稱...

針對使用者(u, g, o, a)做或加或減或等於(+, -, =)的權限設定(r, w, x, X,

s, t, u, g, o)

使用者符號 u - user, g - group, o - other, a - all,

變更權限符號 +, -, =,

權限符號 r, w, x, X, s, t, u, g, o,

(r)讀、(w)寫、 (x)執行(或對目錄的訪問權)、(X)只有目標文件對某些用戶

是可執行的或該目標文件是目錄時才追加 x 屬性,(s)同時設定用戶或組 ID,

(t)粘滯位元(保存程式的文本到交換設備上),(u)目標文件屬主,(g)目標文

件屬主所在的群組,(o)其他用戶。

數字形式:

chmod [選項] [0000~7777] 檔案名稱...

chmod [選項] [000~777] 檔案名稱...

完整的數字權限是 4 位數字。但一般狀況下,都只帶入三位數字,其代表的就

是"後三位數"的權限設定。

第一位數

代表檔案或目錄的特殊屬性。 4 代表 "suid"﹔2 代表

"sgid"﹔1 代表 "粘滯位元 - save text image"

後三位數

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 46

chmod

依序代表 "user-檔案擁有者","group-群組","other-其他

"。每一位數,代表三種權限的疊加,4-讀(r),2-寫(w),1-

執行(x)。被禁止的權限則以 0 帶入。

每位數,數字疊加的範圍是 0-禁讀(0),禁寫(0),禁執行

(0),到 7-可讀(4),可寫(2),可執行(1)。所以,三位數的權

限數值是(000~777)。

選項說明

-c, --changes :顯示以確定更改的資訊

-f, --silent, --quiet :不顯示錯誤訊息(大部分)

-v, --verbose :顯示工作程序

-R, --recursive :目錄變更(含其下的所有子目錄與檔案)

操作實例

變換檔案

# chmod -c ug+x aa

mode of `aa' changed to 0744 (rwxr-xr--)

#

用符號方式,對 aa 檔案,所屬使用者(u) 與所屬群組(g)賦予(+)可執行權限(x)。

# chmod -c 700 aa

mode of `aa' changed to 0700 (rwx------)

#

用數字方式,修改 aa 檔案權限為 700,也就是使用者可讀寫執行,所屬群組與其他使用者,沒

有任何使用權限。

# chmod g-s bb

撤消 bb 檔案的 sgid 位元設定。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 47

chmod

# chmod ug+s cc

設定 cc 檔案的 suid 與 sgid 位元。

變換目錄

# chmod -Rv 700 akdt

mode of `akdt' changed to 0700 (rwx------)

mode of `akdt/KDE-01.jpg' changed to 0700 (rwx------)

mode of `akdt/KDE-02.jpg' changed to 0700 (rwx------)

mode of `akdt/KDE-03.jpg' changed to 0700 (rwx------)

mode of `akdt/KDE-04.jpg' changed to 0700 (rwx------)

(以下省略....)

# sync

變換 akdt 目錄的所有權限為 700。如果牽涉的檔案數量龐大的話,最好在指令執行完畢後,手

定更新一下硬碟的 super block。

這個常用的指令,就寫(打)到這裡了。我想應該夠用才對。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 48

chown

chown

指令語法

chown [OPTION]... OWNER[:[GROUP]] FILE...

chown [OPTION]... :GROUP FILE...

指令說明

在農夫個人早期 SunOS 的使用印象,chown, 是 root only 的管理者指令,歸類在 man(8)。沒

想到我在 linux ,發現他跑到 man(1) 中,被當成一般使用者指令來看待。

在多人多工的作業系統中,基於安全考量,並非任意檔案的擁有者或任意的使用者,都可隨意地

將檔案變更成毫無相干的任意的其他使用者。因此像 chown 以及 chgrp 這類指令在執行權限上

是有必須加以管制的。

這個 GNU 所撰寫的 chown 指令,不僅可更改檔案的擁有者,還支援修改檔案的所屬群組。但基

於安全機制考量,只有 root 才能變更檔案擁有人與所屬群組的使用權限。一般使用者,只能在

擁有檔案的狀態下,使用 chown 來更改檔案的所屬群組。但不可以變更檔案的擁有者。當然,允

許變更的群組以該使用者被 /etc/group 正式登錄的資料為限。

選項說明

-c, --changes

顯示以確定更改的資訊

--dereference

當指定的檔案型態是 symbolic link 時, 主動將變更的檔案指向 symbolic link 檔案的實體檔

-h, --no-dereference

只變更該 symbolic link 檔案本身,不變更 symbolic link 檔案的實體檔案

-f, --silent, --quiet

不顯示錯誤訊息(大部分)

-R, --recursive

變更目錄,包含其下所有資料

-v, --verbose

顯示工作程序

--help

顯示程式用法資訊

--version

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 49

chown

顯示程式本身的版本資訊

實例說明

# ls -l

total 8

lrwxrwxrwx 1 root root 10 6 月 29 12:49 chown-1.html -> chown.html

-rwxr-x--- 1 root root 4218 6 月 29 12:49 chown.html

#

假設,我(root) 要將 chown.html 檔案變更成 akira 是檔案擁有人,群組是 farmer。做法如下:

# chown akira:farmer chown.html

# ls -l

total 8

-rwxr-x--- 1 akira farmer 4218 6 月 29 12:49 chown.html

#

再來我(root) 要將 chown-1.html 這個 symbolic link 檔案的群組變更為 farmer,但不變更檔

案擁有者。

# chown -h :farmer chown-1.html

# ls -l

total 8

lrwxrwxrwx 1 root farmer 10 6 月 29 12:49 chown-1.html -> chown.html

-rwxr-x--- 1 akira farmer 4218 6 月 29 12:49 chown.html

#

可以看到 root 在這一方面擁有絕對的變更權限。這份"特權"來自於被賦予管理的"責任"。(前者

多數人為之樂此不疲後者卻也多數人避之唯恐不及)

一般使用者受限於安全因素,是不允許變更檔案擁有者的。來看以下這個例子

# ls -l

total 4

-rw-rw-r-- 1 akira akira 73 6 月 29 12:51 doc-001

# chown farmer doc-001

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 50

chown

chown: changing ownership of `doc-001': 此項操作並不被允許

#

但在 linux 中,卻允許一般使用者變更其擁有檔案的所屬群組(這點在 BSD 4.4 中是禁止的)

# chown :farmer doc-001

# ls -l

total 4

-rw-rw-r-- 1 akira farmer 73 6 月 29 12:51 doc-001

當然,做這件事情的先決條件是使用者本身必須是該群組的成員才可變更。這項功能提供了一般

使用者相當程度的自主性來面對群組成員間的資料共享管理問題。農夫個人認為是一項不錯的彈

性開放。

這篇就寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 51

chsh

chsh

指令說明

以 UNIX / Linux 系統的運作角度來說,在管理者沒有刻意限制的前提下,一般使用者可以自行

選擇與變更 login shell 種類。chsh 這個指令就是讓使用者自己變更 login shell 的工具。

功能選項

-s, --shell :指定 login shell

-l, --list-shells :顯示系統裡已安裝,可供使用者選用的 shell 路徑資訊

操作實例

以下我將以 w32002,這個假設的帳戶來做一次更改 login shell 的動作。

一般,使用者想清楚自己目前正使用何種 login shell,應當查閱紀錄此項資料的根源

/etc/passwd 檔案。查閱的方式很簡單,使用 grep 指令,以你的帳戶名稱去查閱 /etc/passwd 檔

案即可。

# grep w32002 /etc/passwd

w32002:x:505:5505:web 2002v:/home/w32002:/bin/bash

#

passwd 檔案的訊息格式如下﹔

帳戶名稱:密碼:使用者 ID:群組 ID:使用者訊息:$HOME 目錄:loging shell

因此可以確定目前 w32002 帳戶使用 bash 做為 login shell。假設,現在如果我 (w32002) 想

將 bash 改為 tcsh。該如何做?

以下,農夫就以有點囉唆但卻是極為踏實的方式來演練一遍,用意在提供第一次修改 login shell

的使用者,明瞭該掌握什麼資訊以及該如何做能較不易出錯。

第一步,是先確認系統是否已安裝自己想要使用的 shell。如果,沒有安裝,就必須先進行安裝。

如果已安裝,則記清楚 shell 的"絕對路徑"。

# chsh -l

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 52

chsh

/bin/sh

/bin/bash

/sbin/nologin

/bin/bash2

/bin/ash

/bin/bsh

/bin/tcsh

/bin/csh

#

使用選項 -l 所得到的顯示就是目前已安裝的 shell 的絕對路徑資料。這份資料其實就是

/etc/shells 檔案的內容。

現在,我已清楚看到 tcsh 的"絕對路徑"是在 /bin/tcsh,所以,我可以開始進行下一個步驟,

變更 login shell

# chsh -s /bin/tcsh w32002

Changing shell for w32002.

Password:

Shell changed.

#

選項 -s 後面接的就是 shell 的"絕對路徑",請務必注意,一定要使用"絕對路徑"。

成功地更改後,最好再確認一下 /etc/passwd 檔案內的資料。

# !grep

grep w32002 /etc/passwd

w32002:x:505:5505:web 2002v:/home/w32002:/bin/tcsh

#

上述的步驟,使用者可以省略掉任何已有把握的步驟。

其實,目前的 chsh 已經能防範非法以及錯誤的 shell 指定,可說是已具備"防呆"功能了。所以

上述兩類的錯誤對使用 chsh 指令來說已不會發生。除非使用者以 root 手動錯改 /etc/passwd

以及/etc/shadow 等檔案內容。

這篇就寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 53

chsh

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 54

clear

clear

指令語法

clear

指令說明

在終端機內操作,通常沒幾個指令,螢幕就會被資料佔滿,而游標將總是停留在最底部。如果想

清除所有的顯示,讓游標回到螢幕上方,可手動使用這個指令,她能清除終端機畫面。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 55

cmp

cmp

指令語法

cmp [-l | -s ] file1 file2 [skip1 [skip2 ] ]

指令說明

這是個簡單的文件比對指令。一次只能比對兩個檔案。當檔案內容完全相同時,指令就不會做任

何訊息顯示,當檔案內容有所差異時,指令會輸出在第幾個 byte 及第幾行有差異。(byte 與行

數皆由 1 開始算起)

選項說明

-l

顯示所有的內容差異。行數為十進位,但位元的值則以 8 進位表示。Print the byte number

(decimal) and the differing byte values (octal) for each difference.

-s

檔案比對,不顯示任何訊息。僅以狀態值回應,0 表示文件內容相同,1 表示文件內容有差異,

>1 表示指令執行產生問題。

實例說明

# cmp fileA fileB

fileA fileB 不同:第 21 位元,第 2 行

#

當兩個檔案的內容有所不同時,會即刻輸出信息,並停止比對的動作。這是指令預設的比對狀態,

所以指令本身的用意僅是在於回應檔案是否有所不同。算是的用意單純的指令。

如果想用這個指令告訴你兩個檔案所有的不同處,可以加上 -l 選項

# cmp -l fileA fileB

21 141 142

32 142 143

#

指令對不同的位元資料,以 8 進位編碼輸出。這是他的顯示方式。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 56

cmp

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 57

col

col

指令語法

col [-bfpx] [-l num]

指令說明

col 指令的作用是濾除標準輸入中所含的反向與半反向換行符號,並以連續的空白格取代跳格字

元(tab),讓輸出的結果僅剩下正向或半正向換行符號。這種過濾功能對轉存 nroff(1) 或 tbl(1)

這類的輸出資料成為存文字檔案是相當棒的解決工具。

指令僅支援從標準輸入讀取資料,並直接輸出到標準輸出。不支援檔案的讀取或儲存。

選項說明

-b 不輸出任何的退格(backspaces),只列出行末的符號

-f 允許(不濾除)正向半換行符("fine" 模式). 通常,位在半行分界線的字元會列印到下

一行。

-p 讓無法判別的控制字元通過並列印到輸出。

-x 以輸出連續空格取替換跳格(tab)

-lnum 設定緩衝記憶體,以"行"為單位。預設值為 128 行。

以下是 col 所能判別的特殊字元資料,括符內為其十進位的值。

ESC-7 反向換行符號(escape then 7)

ESC-8 半反向換行符號(escape then 8)

ESC-9 半反向換行符號(escape then 9)

backspace 回移一列 moves back one column (8); 第一列乎略不處理

carriage return (13)

newline 正向換行符號(10); 等於 carriage return

shift in 轉換到正常字元集(15)

shift out

轉換到替代字元集(14)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 58

col

space 正向移動一列(32)

tab 正向移動到下一個 tab(9)

vertical tab 反向換行符號(11)

不在上列的控制字元以及 escape 序列都將會被丟棄。

col 在讀取字元時,會保持與字元集的聯繫用以確保輸出字元的正確性。萬一出現輸入企圖回溢

到已被刷新的前一行狀態,col 將會顯示警告訊息。

實例說明

col 指令一般常用來處理轉存 man 指令的輸出資料。因為 man 指令輸出的線上說明文字其中夾雜

有相當多的控制字元。

# man df > df_A

# cat -v df_A | head

cat -v aa | head

DF(1) FSF DF(1)

N^HNA^HAM^HME^HE

df - report filesystem disk space usage

S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS

d^Hdf^Hf [_^HO_^HP_^HT_^HI_^HO_^HN]... [_^HF_^HI_^HL_^HE]...

#

上例中,你可以清楚地看到直接存檔的內容中夾帶的 nroff 控制字元。如果僅需要純文字的話,

用 col 指令過濾。用法如下

# man df | col -b > df_B

# cat -v df_B | head

DF(1) FSF DF(1)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 59

col

NAME

df - report filesystem disk space usage

SYNOPSIS

df [OPTION]... [FILE]...

#

這篇簡單地寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 60

colrm

colrm

指令語法

colrm [startcol [endcol ] ]

指令說明

指令 colrm 你可以說他是個單純的過濾器,資料只接收標準輸入,移除你指定的"列",然後輸出

到標準輸出。

指令對輸入的資料,以單一字元為列,從 1 開始計算。指定的範圍,一個引數代表從第幾列開始

移除;兩個引數,則代表從第幾列到第幾列之間做移除。

實例說明

我編輯的一個簡單的文字檔 fileA 內容如下

# cat fileA

1234567890abcdefg

234567890abcdefgh

34567890abcdefghi

#

現在我只想保留前面兩個字母,我可以使用 colrm 來做移除的動作,只要從 3 開始移除就好了,

如下

[root@www test]# cat fileA | colrm 3

12

23

34

#

如果,我想移除第三個字元到第六個字元,也可以,如下

# cat fileA | colrm 3 6

127890abcdefg

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 61

colrm

23890abcdefgh

3490abcdefghi

#

以上,就是 colrm 指令支援的移除功能,剛好需要時,還蠻好用的。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 62

comm

comm

指令語法

comm [OPTION]... LEFT_FILE RIGHT_FILE

指令說明

這是一個簡單的檔案內容比對公具。指令支援兩個檔案的"行"比對。

選項說明

-1

不顯示左邊檔案(LEFT_FILE)的內容

-2

不顯示左邊檔案(RIGHT_FILE)的內容

-3

不顯示左右檔案比對完全相符的內容

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

先來看個完全不用顯項的的指令顯示結果,

# comm 1207 1208

60274 3 akhttpd

27978 1 akm

40056 1 akm

02992 1 akm~

14329 1 akw3

30014 2 bak-web

14189 1 bwef

40056 1 akm~

14329 1 akw3

30014 2 bak-web

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 63

comm

14189 1 bwef

55634 1 fdoc

32470 1 fdoc~

03896 2 K12mysqld

08607 1 linkout

15102 1 linkout.sed

52257 1 ot

56075 1 s-mrtg

13815 1 s-usage

58612 1 w-acc

65180 1 w-acc.sed

#

兩個檔案的行內容在比對後,相符的行,顯示時會被加上有兩個跳格(TAB);有差異的行內容,沒

有跳格的是左邊檔案,一個跳格符號的是右邊檔案的內容。這即是 comm 指令的顯示方式。

指令也支援單獨顯示左邊檔案,或右邊檔案,及只顯示比對差異的結果。

# comm -3 1207 1208

27978 1 akm

40056 1 akm

02992 1 akm~

14329 1 akw3

30014 2 bak-web

14189 1 bwef

40056 1 akm~

14329 1 akw3

30014 2 bak-web

14189 1 bwef

#

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 64

compress

compress

指令語法

compress [ -f ] [ -v ] [ -c ] [ -V ] [ -r ] [ -b bits ] [ name ... ]

uncompress [ -f ] [ -v ] [ -c ] [ -V ] [ name ... ]

zcat [ -V ] [ name ... ]

指令說明

這是個 UNIX 時代的老壓縮指令。如果你看到一個檔案附檔名中有大寫的字母 Z,那大概就用的

上 compress 指令了。如今,慣用這個壓縮指令的人可能不多見了。

使用 compress 壓縮的資料,一般冠上 .Z 的附檔名,想解壓縮可以使用 uncompress 指令。

選項說明

-c

將結果輸出到標準輸出。

-f

強迫寫入檔案。會覆寫已存在的目的檔案

-v

顯示執行過程

-b bits

設定共同字串的長度,以位元為單位。(預設值 16)

-V

顯示程式本身的版本資訊

實例說明

壓縮

# compress -f wlog.tar

對 wlog.tar 進行壓縮,執行後產生 wlog.tar.Z

解壓縮

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 65

compress

# uncompress wlog.tar.Z

將 wlog.tar.Z 解壓縮,執行後產生 wlog.tar 檔案。

目前打包壓縮的使用習慣大多是 tar+gzip。這種 *.Z 的檔案已經不多見了。這篇知道即可。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 66

continue

continue

指令語法

bash

continue [n]

tcsh

continue

指令說明

基本上 bash 與 tcsh 都有內建的 continue 指令,基本上作用相同。在迴圈中如果碰到

continue,那在她之下處理程序將會被忽略,然後,直接跳到下一輪迴圈繼續執行。這個動作和

放唱片的"跳針"差不多。以下是她們各自的功能說明。

bash

在 bash 環境下,內建指令 break 可使用在 for, while, until 與 select 等迴圈類型中。指

令可帶入一個 n 值,也就是指定第 n 層迴圈的意思。此 n 值必須 大於或等於 1。當帶入的 n 大

於實際的迴圈層數,則執行最外層的迴圈。

tcsh

在 bash 環境下,內建指令 continue 可使用在 foreach 及 while 這兩種迴圈類型。

實例說明

bash

以下的例子是單純為介紹使用語法而寫的,請不要太在意例子本身的作用。

# cat continueb01

#!/bin/bash

NUMLIM=19

a=0

while [ "$a" -le "$NUMLIM" ]

do

a=$(($a+1))

if [ "$a" -gt 10 ]

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 67

continue

then

continue

fi

echo -n "$a, "

done

echo ""

exit 0

#

一個簡單的 while 迴圈中使用 if 判斷式讓大於 10 的情況忽略 echo 的執行,並跳到下一輪的

迴圈繼續執行。以下是她的執行結果

# continueb01

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

#

再來看個雙層迴圈的例子。如下

# cat continueb02

#!/bin/bash

for loopA in 2 4 6 8 10

do

echo -n "loopA $loopA _ "

for loopB in 2 4 6 8 10

do

if [ "$loopB" -eq 8 ]

then

echo -n "loopB $loopB, "

continue 2

fi

done

echo "loopB -end"

done

echo "loopA -end"

exit 0

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 68

continue

上例使用了雙層的 for 迴圈,內層迴圈有一道 if 判斷式,當帶入迴圈的數值等於 8 時,執行

echo 然後再執行 continue 2,直接跳到外層迴圈,繼續下一輪的執行。

# continueb02

loopA 2 _ loopB 8,

loopA 4 _ loopB 8,

loopA 6 _ loopB 8,

loopA 8 _ loopB 8,

loopA 10 _ loopB 8,

loopA -end

#

tcsh

來看個單純的 while 迴圈中使用 continue 的情況

# cat continuet01

#!/bin/tcsh

@ a = 0

@ line = 10

while ($a != $line)

@ a++

if ("$a" <= 5) continue

echo -n "$a, "

end

echo ""

#

迴圈 while 會帶入 0~9 的數值,然後對帶入的數值加 1,判斷式檢查數值是否小於等於 5,如

果是忽略下面的 echo,直接進行下一輪的 while 執行。所以我們可以預期 echo 的執行不會有

1~5 的數值出現。以下是執行結果。

# continuet01

6, 7, 8, 9, 10,

#

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 69

continue

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 70

cp

cp

指令語法

cp [OPTION]... SOURCE DEST

cp [OPTION]... SOURCE... DIRECTORY

cp [OPTION]... --target-directory=DIRECTORY SOURCE...

指令說明

就我個人經驗而言,這是個一般使用者(包含我自己在內)常用卻不見得完全熟悉與掌握的指令。

多半原因在於一般使用者常態操作下沒有使用上的必要,因此"沒用"。但,有時則是因為使用者

不清楚檔案系統的結構,以至於到該用的時候,"沒用"。

不管如何,為了應付檔案系統的特性需求,她擁有壯觀的功能選項。

選項說明

a, --archive

保留原檔案的所有屬性結構(檔案權限、擁有者、群組與時間紀錄),功能與 -dpR 選項相同

--backup[=CONTROL]

對已存在的目的檔,建立備份檔。目前支援的 CONTROL 引數及作用如下

• none, off, = 如目的檔名已存在,顯示警告訊息並退出程式

• numbered, t, = 自動產生 "檔名~n~" 的備份檔案,已存在的備份檔案會自動變更版本

名稱

• existing, nil, = 如已有 "檔名~n~" 備份檔,則產生新備份檔;如沒有,只覆寫已有

的備份檔。

• simple, never, = 建立簡單的備份檔(新檔覆寫舊檔)

-b

功能與上面的 --backup 選項相近,但不支援參數設定

-d, --no-dereference

遇到 symbolic links 時,不進行複製

-f, --force

必要時,刪除已存在而無法開啟的檔案後,再嘗試複製

-i, --interactive

在覆寫檔案前顯示提示

-H

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 71

cp

對 symbolic links 來源檔案建立實體目的檔案

-l, --link

建立 hard links 來取代複製的動作

-L, --dereference

遇到 symbolic links 時,進行複製

-p, --preserve

保留原檔案的屬性(使用權限,擁有者,群組,時間等紀錄)

--parents

建立來源檔案的完整目錄

-r

複製目錄

--sparse=WHEN

處理稀疏(sparse)檔案的特殊選項

-R, --recursive

複製目錄

-s, --symbolic-link

以建立 symbolic links 來取代複製的動作

--target-directory=DIRECTORY

指定特定的已存在的目錄,作為複製檔案的目的目錄

-u, --update

這選項會進行來源檔案與目的檔案的比對,當來源檔案對目的檔案而言是新的或尚不存在時才進

行複製。如果比對的結果相同,則不做任何動作

-v, --verbose

複製前顯示複製檔名信息

-x, --one-file-system

複製時忽略屬於不同檔案系統(filesystem)的子目錄

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

關於檔案屬性的完全複製(-a 選項)

一般拷貝得來的新檔案,其建檔時間會是拷貝當時的時間為準。而不是原檔案的建檔時間。也就

是說,檔案的相關屬性如檔案使用權限,擁有者,群組,時間等,都會因複製而更動。目的檔案

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 72

cp

的權限以使用者設定的 umast 做依據,擁有人與群組預設值是自己與所屬群組,時間紀錄的是複

製當時的時間。

# cp /var/log/lastlog .

# ls -l /var/log/lastlog lastlog

-rw-r--r-- 1 root root 19136220 7 月 16 13:46 lastlog

-rw-r--r-- 1 root root 19136220 6 月 6 21:31 /var/log/lastlog

#

以上是一般使用者,常態性的操作。現在我假設多數人都是在完全了解的情況下操作,接下來的

疑問(其實是另一種需求)就必定有一天會發生...可否在複製時不改變它們?

答案是肯定的。有時在管理上,某些紀錄檔案其檔案屬性也是相當重要的資訊(如最後被讀取或寫

入的時間),如果想在複製時完整地保留原紀錄,就必須加上 -a 選項來做

# cp -a /var/log/lastlog .

cp: overwrite `./lastlog'? y

# ls -l /var/log/lastlog lastlog #顯示最後修改時間(last-modification times)

-rw-r--r-- 1 root root 19136220 6 月 6 21:31 lastlog

-rw-r--r-- 1 root root 19136220 6 月 6 21:31 /var/log/lastlog

# ls -lu /var/log/lastlog lastlog #顯示最後讀取時間(last-access times)

-rw-r--r-- 1 root root 19136220 7 月 16 13:46 lastlog

-rw-r--r-- 1 root root 19136220 7 月 16 13:46 /var/log/lastlog

可以清楚地看出,檔案權限,擁有者,群組最後修改時間, 最後讀取時間等紀錄都與原檔案相同。

但唯一不可避免被更改的是最後更改狀態時間(changed-status times),這項時間會以紀錄當時

複製的時間,而非原檔案的紀錄。

# ls -lc /var/log/lastlog lastlog #顯示最後更改狀態時間

-rw-r--r-- 1 root root 19136220 7 月 16 13:46 lastlog

-rw-r--r-- 1 root root 19136220 6 月 6 21:31 /var/log/lastlog

#

對於先前農夫的假設不成立者,我的建議是回頭理解檔案系統(filesystem)的權限,使用者,群

以及檔案時間紀錄等項目。

以備份的觀念複製(--backup 選項)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 73

cp

有時,我複製一個檔案的理由是"版本備份"。譬如,修改程式檔案,想紀錄每個異動版本。這種

情況可以使用 --backup 選項來進行複製備份的動作。

# ls -l

total 16

-rw-r--r-- 1 root root 5348 7 月 11 02:20 free.c

-rw-r--r-- 1 root root 6002 7 月 11 02:16 free.c_bak

#

上面顯示的是剛修改完 free.c 的檔案狀況。其中的 free.c_bak 是原始 free.c 的備份。

現在我準備複製目前的 free.c 到備份的檔案名稱 free.c_bak,但仍舊想保留目前的

free.c_bak 版本,cp 指令的語法如下

# cp --backup=t free.c free.c_bak

# ls -l

total 24

-rw-r--r-- 1 root root 5348 7 月 11 02:20 free.c

-rw-r--r-- 1 root root 5348 7 月 11 02:22 free.c_bak

-rw-r--r-- 1 root root 6002 7 月 11 02:16 free.c_bak.~1~

#

如果沒有加上 --backup=t ,原先的 free.c_bak 會被覆寫。加上後檔案則會被保留,也就是

"free.c_bak.~1~" 檔案。如果再次改版,並重複一次相同的複製動作,就會再多產生一個備份檔

案 "free.c_bak.~2~",依此類推。我既達到保有所有更改版本的目的了。

# ls -l

total 32

-rw-r--r-- 1 root root 5147 7 月 11 03:03 free.c

-rw-r--r-- 1 root root 5147 7 月 11 03:04 free.c_bak

-rw-r--r-- 1 root root 6002 7 月 11 02:16 free.c_bak.~1~

-rw-r--r-- 1 root root 5348 7 月 11 03:02 free.c_bak.~2~

以上的作法是 --backup[=CONTROL] 其中的一項,其合法的 CONTROL 引數有下列四種

`none' = `off',

`simple' = `never',

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 74

cp

`existing' = `nil',

`numbered' = `t'

尚未說明的引數,就留給需要的人自己玩玩,在此就不再多做說明了。

建立複製來源的完整目錄( --parents 選項)

這個選項支援一項蠻特別的複製方式,建立來源檔案的完整目錄。

# pwd

/root/test

# cp --parents /var/log/maillog .

# tree

.

`-- var

`-- log

`-- maillog

2 directories, 1 file

#

打趣地說,這是一個"剪-貼"選項。他就像把來源檔案連帶目錄一起剪下來,然後直接貼在目前的

工作目錄。所以看到的是上例的複製結果。

對目錄的複製(-R, -r 選項)

cp 指令的預設值是不複製目錄的,所以要複製目錄得加上 -R 或 -r 選項。

# cp -r /usr/share/man/man1 man1

# ls -l

total 32

drwxr-xr-x 2 root root 32768 7 月 15 17:09 man1

#

對一般的目錄與檔案使用 -R 或 -r 選項都可以達到複製的目的。但當來源目錄中含有 symbolic

links 檔案或子目錄或者是特殊檔案 - FIFOs 時,這兩個選項處理的方式就有所差異了。"-r 選

項"會嘗試去讀取像 FIFOs 這類的特殊檔案,如果你打算複製 /dev/console,那她的反應將會很

好玩,在你下達指令後,所有的鍵盤的輸入會真的被儲存到複製指令的目的檔案中,使用者無法

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 75

cp

看到自己的輸入也無法以正常的方式來終止複製指令。所以這類的運用,使用者必須加以避免。

"-R 選項"則不會嘗試去讀取,但會直接以來源檔案的特殊型態建立目的檔案。

相關於 link 檔案與目錄的複製

在一般複製狀況下,拷貝一個連結的目錄其實是創造另一份連結。

# ls -l /etc/httpd/logs

lrwxrwxrwx 1 root root 19 6 月 21 04:32 /etc/httpd/logs -> ../../var/log/httpd

# cp -R /etc/httpd/logs logsBK

# ls -l

total 0

lrwxrwxrwx 1 root root 19 7 月 14 19:28 logsBK -> ../../var/log/httpd

#

有時為了某理由,我需要複製的目的檔案或目錄都必須是"真實" 的,絕對不能是 hard links 或

symbolic links 形式的資料。這必須加上 -H 選項來做

# cp -RH /etc/httpd/logs logsR

# ls -l

total 4

lrwxrwxrwx 1 root root 19 7 月 14 19:28 logsBK -> ../../var/log/httpd

drwxr-xr-x 2 root root 4096 7 月 14 19:30 logsR

#

將數個檔案或目錄複製到指定的目錄下(--target-directory=DIRECTORY 選項)

正常語法無法支援同一時間指定數個來源檔案一起複製到某個目錄下。但這樣的操作是有其必要

性,甚至可能是使用上常用的,所以 cp 支援了這個獨立的選項,來處理這樣的操作。

# mkdir aklog

# cp --target-directory=aklog /etc/httpd/logs/access* /var/log/mail*

支援稀疏檔案(sparse file)處理(--sparse=WHEN 選項)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 76

cp

有時想完整地複製應用軟體或資料庫資料時,總會碰上一些大號的檔案,其中肯定夾雜著稀疏檔

案。這種檔案的內容有很多只填上 0的區塊,真正的"資料"其實少的可憐。這種檔案如果經過妥

善的處理的話,能節省相當可觀的硬碟空間。

版本控制功能

目前的 RedHat 9.0 或 Fedora,甚至絕大多數的 linux 安裝套件,基礎指令的部分大都是採用

自由軟體基金會(Free Software Foundation, Inc.)的套件。ln 指令包含在 coreutils 當中。

目前的版本(coreutils-4.5.x)已支援版本控制。也就是選項 -b 與 --backup[=CONTROL]。這部

分農夫我打算以專文說明。

這篇是斷斷續續的集合,先暫時寫到這裡好了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 77

crontab

crontab

指令語法

crontab [ -u user ] file

crontab [ -u user ] { -l | -r | -e }

指令說明

crontab 提供我們在固定的間隔時間執行自訂的程式、系統指令或 shell secrip。時間間隔的單

位可以是分鐘、小時、日、週、月及以上的任意組合。允許使用者離線執行,並且可以將執行結

果以 email 通知使用者。因此,非常設合對週期性的管理分析或資料備份等工作。

基本上,crontab 的指令格式分為六個部分,前五個為時間間隔,最後則是執行的指令。每一個

部分用空格來區隔。

1. 幾分 -- 0-59

2. 幾時 -- 0-23

3. 幾日 -- 1-31

4. 幾月 -- 1-12 或使用英文名稱

5. 星期幾 -- 0-7 或使用英文名稱

6. 工作命令 -- 指令,shell script,程式....(建議使用絕對路徑)

以上是 crontab 的基本格式。

選項說明

-u user

以指定的使用者身份,執行 crontab 工作。此選項僅供 root 使用。

-l

顯示使用者現行的 crontab 檔。

-r

移除現行的 crontab 檔。

-e

進入 vi 編輯 crontab 檔(如有設定 VISUAL 或 EDITOR 環境變數,怎使用該環境變數所設定的編輯

器來編輯)。在使用者退出編輯器後,會自動將所編輯 crontab 檔,置入 crontab 執行。

相關檔案

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 78

crontab

/etc/cron.allow

/etc/cron.deny

實例說明

# crontab -l

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (/tmp/crontab.3672 installed on Thu Jan 1 15:55:18 2004)

# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

0 0-23/6 * * * /usr/bin/webalizer

30 3 * * * /root/fbin/bak-web

#

先前曾提到,crontab 的格式分成六個部分,前五個是時間參數。在上例中你會發現除了數字與

英文名稱,有使用到符號"*",這個符號代表每一單位的意思,譬如 30 3 * * * 既代表 30 分 3

點 每日 每月 星期的每天。

時間的指定,可以是單一的數字,或幾個數字用逗號來連接。看下例

30 3,12 * * * /root/fbin/bak-web

其中的第二項為 3,12,這代表 3 以及 12 小時的意思。再來看下例

30 */6 * * * /root/fbin/bak-web

我把第二項改成 */6 這代表每 6 小時,也相當於 6,12,18,24 的作用。此外還有一個區段的做

30 8-18/2 * * * /root/fbin/bak-web

我把第二項改成 8-18/2 這代表在 8 小時到 18 小時之間每 2 小時,也相當於

8,10,12,14,16,18 的作用。

在認知的以上介紹各項時間用法後,你可以視實際的需要自行組合。使用上的彈性是相當自由的。

這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 79

csplit

csplit

指令語法

csplit [OPTION]... FILE PATTERN...

指令說明

這是一個關於"分割檔案"的指令。csplit 支援的分割方式是以指定的 PATTERN 做為來分割檔案

內容的參考指標。指令對於指定 PATTERN 支援"正則表達式"語法。

這個分割特性非常適合像以章節名稱來切割一篇長篇文件,或以主標題名稱來分割一份報告。由

於分割特性的關係,使用者在下指令前,必須先對檔案內容有充分的掌握。

csplit 指令根據指定樣式分割檔案,並將結果輸出到 'xx01', 'xx02'... 檔案中。同時會自動

在標準輸出顯示每個分割檔案的位元數大小。

選項說明

-b, --suffix-format=FORMAT

以 sprintf 格式 FORMAT 代替 %d

-f, --prefix=PREFIX

以前置字串 PREFIX 代替 'xx'

-k, --keep-files

產生錯誤時,不移除輸出檔案

-n, --digits=DIGITS

使用數字,代替字元字串(此處的數字,既代表第幾行的行數)

-s, --quiet, --silent

不顯示輸出檔案的大小

-z, --elide-empty-files

移除內容空白的輸出檔案

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

當檔名代入符號 '-' 時,指令由標準輸入讀取資料。指定的 PATTERN 可以如下:

INTEGER (整數)

複製直到指定行數的前一行

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 80

csplit

/REGEXP/[OFFSET]

複製直到指定的"正則表達式"的前一行。行數的 OFFSET (偏移值) 必須為正或負整數。

%REGEXP%[OFFSET]

乎略,直到指定的"正則表達式"的前一行。行數的 OFFSET (偏移值) 必須為正或負整數。

{INTEGER}

將先前的樣式重複指定的次數

{*}

將先前的樣式重複最大可能的次數

實例說明

限於個人甚少使用到這個指令的因素,我僅以一個非常典型的例子來說明這個指令的用法,請看

下面這個"待宰"文字檔

# cat paper.txt

ch.1

asdfasdfasdf

asdfasdfasdf

asdfdekekeel

asdkekek fek

ch.2

asdfiekijfie

asdfjie

asdklei

dskfie

ch.3

asdfkek

askdke

kekek

ekke

#

我想將上例的文字檔 paper.txt,以其中的內容標題 ch.1, ch.2, ch.3 做文件切割,這可以使

用 csplit 來做

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 81

csplit

# csplit paper.txt /ch.1/ /ch.2/ /ch.3/

0

62

46

36

#

以上是指令成功分割檔案後的顯示。範例中的 paper.txt 由於 ch.1 之前沒有任何內容,所以第

一個檔案 xx00 的位元數為 0,也就是說檔案內容空的。然後的 62 則是 ch.1 到 ch.2 之間的

內容。餘下類推。

嚴格來說,csplit 在實際情況應用上要較上例複雜許多。想順利運用的話,能對"正則表達式"語

法有更深入理解的話,會有相當大的幫助。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 82

cut

cut

指令語法

cut [OPTION]... [FILE]...

指令說明

David 問:這個指令在割檔案的什麼東西?? Dr. who 說:重要部分。也就是說,割下來你要的,

不是割下來丟掉。

指令以行為單位,依據你下的選項所給的參數位置,去"割"你指定的檔案,然後把結果,輸出到

標準輸出。當你沒指定檔名,或使用 "-" 符號時,指令將從標準輸入讀取資料。

選項說明

-b, --bytes=LIST

顯示指定的"位元"數內容,跳格與倒退鍵以 1 位元計算。

-c, --characters=LIST

顯示指定的"字元"數內容,此選項對像中文這種雙位元字碼的語系較不會造成亂碼現象。跳格與

倒退鍵以 1 個字元計算。

-d, --delimiter=DELIM

自訂欄位的區隔字元(預設值是跳格字元-TAB)

-f, --fields=LIST

顯示指定的"欄位"內容,預設的欄位區隔是跳格字元(TAB)。如果沒有搭配 -s 或

--only-delimited 選項一起使用,當內容沒有符合的欄位區隔字元,指令會將整行內容輸出到標

準輸出。

-s, --only-delimited

當內容沒有符合的欄位區隔字元,該行內容不顯示

--output-delimiter=STRING

自訂 STRING 字串做為輸出資料的區隔符號。預設值是使用輸入資料的區隔字元。

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

基本上,選項 -b、-c 及 -f 的範圍指定方法是相同,以下是目前支援的模式。

N

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 83

cut

第 N 個 byte 或字元或欄位

N-

從第 N 個到行尾的 byte 或字元或欄位

N-M

從第 N 到 M 個之間的 byte 或字元或欄位

-M

從行的開頭到第 M 個 byte 或字元或欄位

上述的四種格式,允許使用分號區隔,加以做連續組合運用

實例說明

選項 -b -c 的切割差異與適用性

選擇適當的切割,必須先從認知來源檔案的內容開始。一般的英文或數字的內容,使用 -b 或 -c

並沒有差異,但如果內容有雙位元的字元,那建議使用 -c,如果要使用 -b 在 bytes 的計算上

必需留意正確性,否則會出現亂碼。

# cat seelog

總計 21920

-rw-r--r-- 1 akira akira 22411954 11 月 29 17:55 see_log

-rw-r--r-- 1 akira akira 141 11 月 29 17:55 err_log

#

檔案 seelog 內容是中文、英文與數字的組合。如果我們使用 -b 選項做切割

# cut -b1 seelog

?

-

-

#

當我們只指定單位元輸出時,雙位元的字元就會變成只輸出一半。在這種情況下,如果我們改用 -c

選項,輸出情況就會不同

# cut -c1 seelog

-

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 84

cut

-

#

這種情況,最好事先留意。因為我們的母語中文,剛好就是雙位元文字。

欄位,跳格,輸出

當,來源檔案內容是含有跳格字元,就符合欄位的定義。cut 指令對這種檔案支援以欄位來作為

顯示的單位。

# cat -T klog

02-14^I 總計^I124812

02-13^I 總計^I3948

# cut -f1,3 klog

02-14 124812

02-13 3948

#

在上述中的跳格字元是 cut 指令的預設值。假使是其他的固定字元,可以使用 -d 選項來變更這

樣使用條件。

當我們使用欄位來做為顯示單位時,就會有一種特例產生;如果有某行內容完全沒有符合設定的

區隔字元時,指令的預設值是,將該行顯示到標準輸出。而 -s 選項的作用就是取消這種行文的

顯示。

現在讓我將上例的 klog 加上一行完全沒有 TAB 的內容,再重新執行一次

# cat -T klog

02-14^I 總計^I124812

02-13^I 總計^I3948

02-12 總計 testline

# cut -f1,3 klog

02-14 124812

02-13 3948

02-12 總計 testline

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 85

cut

果然最後一行顯示出來了。如果不想要,可以加上 -s 選項將之隱藏起來

# cut -f1,3 -s klog

02-14 124812

02-13 3948

#

指定範圍的組合遊戲

cut 指令的範圍指定,在運用上是允許彈性組合的。以下我舉幾個語法組合

# cut -b-10 file_A

# cut -c1-3,10- file_A

# who | cut -d" " -f1

# cut -d: -f1,5 /etc/passwd

坦白說,好好運作這個指令的話,其實可以做不少事。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 86

date

date

指令語法

date

date [OPTION]... [+FORMAT]

date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

指令說明

對多數的使用者而言,這是個根本不需要學習的指令。只要鍵入 date 然後 Enter 就能得到目前

的日期以及時間。如果這樣對你已然足夠,那以下內容對你實屬多餘。對一般使用者而言,沒有

必要花時間去理解這些細節的參數設定。

以下資訊是寫給需要對 date 的輸出格式與進一步做做輸出掌控的使用者。

這個指令有兩項功能其一,是最用來顯示目前日期時間。其二,則是用來設定系統時間。輸出格

式的設定彈性極大,自訂方式是在符號"+"後加入指定的格式組合。

選項說明

-d, --date=STRING

以 STRING 來顯示指定的時間,非顯示目前的時間

-f, --file=DATEFILE

作法與 --date 選項相同, 但可設定多行於 DATAFILE 中。

-I, --iso-8601[=TIMESPEC]

以 ISO-8601 格式輸出,`%Y-%m-%d',其中 TIMESPEC 參數可以是 auto, hours, minutes,

seconds

-r, --reference=FILE

顯示指定檔案的最後修改時間(last modification time)

-R, --rfc-822

以 RFC-822 格式輸出 `%a, %_d %b %Y %H:%M:%S %z'

-s, --set=STRING

以 STRING 來設定顯示格式

-u, --utc, --universal

以全球統一時間(Universal Coordinated Time,UTC)的格式顯示

--help

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 87

date

顯示程式用法資訊

--version

顯示程式本身的版本資訊

顯示格式說明

%% 顯示"%"符號

%a 星期顯示,英語系以縮寫 Sun..Sat 顯示,中文顯示週一...週日

%A 星期顯示,英語系以縮寫 Sunday..Saturday 顯示,中文以星期一...星期日顯示

%b 英語系設定顯示完整月份(Jan..Dec),中文設定則顯示 1月..12 月

%B 英語系設定顯示完整月份(January..December),中文設定則顯示一月..十二月

%c 本地日期與時間(西元 2002 年 07 月 19 日 (星期五) 15 時 53 分 22 秒)

%d 日期顯示 (01..31),以月份為單位

%D 日期顯示 (mm/dd/yy)

%e 日期顯示 ( 1..31),以月份為單位,其中的 1~ 9 的第一位數以空格顯示

%h 作用與 %b 相同

%H 時(00..23), 24 小時制

%I 時(01..12), 12 小時制

%j 太陽日(001..366)

%k 時(0..23), 24 小時制

%l 時(1..12), 12 小時制

%m 月(01..12)

%M 分(00..59)

%n 換行

%p AM 或 PM 顯示

%r 時間, 格式為 -- 12-hour (hh:mm:ss [AP]M)

%s 一個秒數,時間計算的起點以格林威治 1970 年 1 月 1日零時零分零秒開始

%S 秒(00..60)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 88

date

%t 水平跳格(Tab)

%T 時間, 格式為 -- 24-hour (hh:mm:ss)

%U 第幾週(00..53),以星期天為週的第一天

%V 第幾週(01..53),以星期一為週的第一天

%w 週幾(0..6); 0 代表星期天

%W 第幾週(00..53),以星期一為週的第一天

%x 本地日期(mm/dd/yy)

%X 本地時間(%H:%M:%S)

%y 西元年份的後兩碼(00..99)

%Y 西元年份(1970...)

%z RFC-822 style numeric timezone (-0500) (a nonstandard extension)

%Z time zone (e.g., EDT), or nothing if no time zone is determinable

實例說明

bash 下的輸出語系的設定

# date

週日 9 月 1 19:26:30 CST 2002

這是一般的狀態顯示。會顯示中文是因為環境變數 LANG 的語系設定

# echo $LANG

zh_TW.Big5

如果想調整輸出為英文訊息,可使用以下方式設定

# export LANG=C

# date

Sun Sep 1 19:27:43 CST 2002

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 89

date

關於"太陽日"的顯示

農夫曾經以"太陽日"為單位過了一段日子。但,我相信應該有人不清楚何謂"太陽日",所以在此

簡單的說明一下,以一年為單位,第一天為 1,第二天為 2,以此累計的日子,即是所謂的太陽日。

閏年的最後一天就是 366,非閏年是 365。和當兵算饅頭其實沒差多少。

如果你想知道,今天的太陽日,可以使用以下語法

# date

週日 9 月 1 19:37:02 CST 2002

# date +%j

244

在不鍵入任何參數的情況下,顯示的就是當天(2002/09/01)的太陽日。

如果要換算"某年某月某天"的太陽日,可用以下方式

# date --date='20020202' +%j

033

或者如下

# date --date='20020202' +%j%t%x

033 西元 2002 年 02 月 02 日

關於顯示格式的調整

除了固定的輸出格式外,指令 date 也支援自訂時間的輸出格式。使用的方式很簡單,先以符號

"+"來整個輸出格式的開頭,後面依序加上需要的顯示格式代號,每個代號前需加上符號"%"。

先來個例子 -- "太陽日/年(西元)"

# date +%j/%Y

244/2002

再來一個 -- "太陽日/年(西元)-月/日"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 90

date

# date +%j/%Y-%m/%d

244/2002-09/01

還來一個 -- "太陽日/年(西元)-月/日(格一個 tab)時間(24 小時制)"

# date +%j/%Y-%m/%d%t%T

244/2002-09/01 22:56:50

自訂顯示格式是一個比較有趣得操作,可使用元件除了上述那一大褂"顯示格式說明"之外,還有

"-"(hyphen)以及"_"(underscore)這兩個符號可作特殊的轉換。來看以下的例子,

# date +%d/%m -d "Sep 1"

01/09

這是一般的顯示,如果有需要拿掉其中的"0",可以使用符號"-"(hyphen),如果要將"0"轉換為"

空格",則可以使用"_"(underscore)來做,指令的格式如下

# date +%-d/%-m -d "Sep 1"

1/9

# date +%_d/%_m -d "Sep 1"

1/ 9

這篇就簡單地說明到此。

附註:

* RFC822 是 1982 年制定的 "ARPA Internet 文字訊息標準格式" 這份文件你

可以到 http://www.rfc-editor.org/ 或

ftp://ftp.isi.edu/in-notes/rfc822.txt 查看。

* ISO 8601 ISO 8601 是由 ISO (國際標準化組織, International Standards

Organization) 所建立的日期的標準,以單一的通用格式來表達日期。

* 全球統一時間(Universal Coordinated Time,UTC)

* 格林威治時間(GMT)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 91

df

df

指令語法

df [OPTION]... [FILE]...

指令說明

df (disk free) 算是常用基礎的指令。用來顯示硬碟的剩餘空間,換一個說法便是,檔案系統的

使用狀態。指令顯示的單位預設值為 block(1024 Bytes)。

選項說明

-a, --all

包含所有的檔案系統(filesystems)

--block-size=SIZE

自訂 SIZE 大小做為區塊(block)的計量單位。

-h, --human-readable

以 K, M, G 為計量單位,選項名稱取叫"人看"(哈!)

-H, --si

與 -h 選項相似,但以 1000 累計而不是 1024

-i, --inodes

顯示 inode 的使用狀態

-k, --kilobytes

同--block-size=1024

-l, --local

只顯示本機硬碟資訊(原定系統預設值是顯示所有系統裝掛的檔案系統,包含網路遠端硬碟)

-m, --megabytes

同 --block-size=1048576

--no-sync

直接顯示資料,不做 sync 處理(預設值)

-P, --portability

以 POSIX 格式輸出

--sync

先做 sync 再顯示資料

-t, --type=TYPE

指定顯示的檔案系統類型。

-T, --print-type

附加列出檔案系統的類型

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 92

df

-x, --exclude-type=TYPE

指定不顯示的檔案系統類型。

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

兩招

基本慣用的 df 模式大致上有兩招。第一招--"不囉唆法"。什麼選項也不加,輕鬆地得到完整的

檔案系統。真是俗又大碗。

# df

檔案系統 1K-區段 已用 可用 已用% 掛載點

/dev/hda7 5036284 628244 4152208 14% /

/dev/hda1 101089 9324 86546 10% /boot

/dev/hda3 20161204 9459896 9677168 50% /home

none 240768 0 240768 0% /dev/shm

/dev/hda6 5036284 3056696 1723756 64% /usr

/dev/hda5 5036284 81128 4699324 2% /usr/local

/dev/hda2 20161204 10117416 9019648 53% /var

/dev/hda9 22624480 19340112 3284368 86% /w2000

#

第二招--"小氣法",指令只顯示指定目錄的檔案系統。

# df /home

檔案系統 1K-區段 已用 可用 已用% 掛載點

/dev/hda3 20161204 11167772 7969292 59% /home

#

其實這招還有一個好處,當你因為目錄連結(link)而迷失時,可以讓你清楚所在目錄歸屬哪一個

檔案系統。

# df .

檔案系統 1K-區段 已用 可用 已用% 掛載點

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 93

df

/dev/hda7 5036284 628628 4151824 14% /

#

看 inode, 檔案系統類型等特殊資訊

當系統發生檔案系統已滿的狀態,通常可能有兩個原因。其一是硬碟空間不足;或者是硬碟還有

空間,但 inode 已用盡。後者發生的主因,通常是因為該檔案系統存在了大量的小檔案,以至於

產生 inode 被用盡,但硬碟空間仍有空餘的現象。所以有時 inode 的資訊最好也留意一下。

# df -i

檔案系統 Inode (I)已用 (I)可用 (I)已用% 掛載點

/dev/hda7 640000 56379 583621 9% /

/dev/hda1 26104 41 26063 1% /boot

/dev/hda3 2562240 95923 2466317 4% /home

none 60192 1 60191 1% /dev/shm

/dev/hda6 640000 155929 484071 25% /usr

/dev/hda5 640000 1384 638616 1% /usr/local

/dev/hda2 2562240 5881 2556359 1% /var

/dev/hda9 0 0 0 - /w2000

#

檔案系統類型牽涉到安全、效率、適用性。但預設的 df 指令並不顯示,必須加上 -T 或 -t 來

顯示。

# df -T

檔案系統 類型 1K-區段 已用 可用 已用% 掛載點

/dev/hda7 ext3 5036284 628216 4152236 14% /

/dev/hda1 ext3 101089 9324 86546 10% /boot

/dev/hda3 ext3 20161204 9459896 9677168 50% /home

none tmpfs 240768 0 240768 0% /dev/shm

/dev/hda6 ext3 5036284 3056696 1723756 64% /usr

/dev/hda5 ext3 5036284 81128 4699324 2% /usr/local

/dev/hda2 ext3 20161204 10117528 9019536 53% /var

/dev/hda9 vfat 22624480 19340112 3284368 86% /w2000

[root@farmer logs]#

這篇就暫時到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 94

df

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 95

dir

dir

指令語法

dir [OPTION]... [FILE]...

指令說明

目前多數的 Linux 中大多採用 GNU 發行的 Core-utils 程式集,因此也有個 dir 指令。我相信

這個指令名稱對使用 DOS 的人來說應該不陌生。在 UNIX 中肩負相同任務的是 ls 指令。因此,

如果你發現這兩個指令同而存在且分放在系統的兩地時,無須驚訝,現況確實是如此沒錯。

嚴格說來這兩個指令並沒有功能差異的必要性,因此在 GNU Core-utils 中 ls 與 dir 是同一支

原始碼,只是編譯時選定不同的預設模式而已。但儘管如此,實際上這裡個程式在系統的運作上,

還是有一些差異處,譬如關於 dircolors 的系統環境預設,這一部份,多數都只對 ls 指令做設

定,而忽略的 dir 指令。因此,如果您慣用 dir 而非 ls,這些小地方可能得自己多注意了。

選項說明

-a, --all

顯示所有檔案,包含特殊檔案(.file)

-A, --almost-all

顯示所有檔案,包含特殊檔案(.file),但隱藏 . .. 這兩個特殊檔案

--author

列出每個檔案的作者

-b, --escape

顯示跳脫字元(escapes)

--block-size=SIZE

自定 block size 的大小

-B, --ignore-backups

不顯示檔名結尾帶符號 "~" 的檔案或目錄(通常 vim 編輯時會自動產生的備用檔案就是會在原

檔名後附加上一個 ~ 符號)

-c

與 -l 選項搭配,會顯示檔案的最後更改時間(ctime),並以檔名排序。與 -lt 選項搭配時會顯

示 ctime 並以 ctime 排序。

-C

多列(columns)顯示,由上而下、由左而右排列。

--color[=WHEN]

顏色顯示設定。參數值有 never(不使用顏色), always(使用顏色), auto(當終端機為標準輸出裝

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 96

dir

置時,使用顏色)。

-d, --directory

僅顯示目錄本身,不顯示目錄下的其他內容。

-D, --dired

以 Emacs 的目錄模式作為顯示格式。

-f

資料以磁碟的存儲順序列出,不另外做排序。啟用 -aU 選項,並取消 -lst 選項的功能。

-F, --classify

檔名後附上代表檔案類型的特殊符號。 * 表示檔案可執行; / 表示目錄; @ 表示符號鏈結;| 表

示 FIFOs; = 表示套接字 (sockets);一般檔案沒有附加符號。

--format=WORD

設定顯示格式。格式(WORD)有 across, horizontal, commas, verbose, single-column,

vertical。功能上 across 等於 -x, commas 等效 -m, horizontal 等效 -x, long 等效 -l,

single-column 等效 -1, verbose 等效 -l, vertical 等效 -C。

--full-time

與 -l --time-style=full-iso 等效。顯示完整的時間。

-g

與 -l 選項相似,但不顯示擁有者欄位。

-G, --no-group

不顯示群組名稱,需搭配 -l 選項使用。

-h, --human-readable

檔案大小以 k, M, G 顯示。選項須與 -l 或 -o 選項合用。

--si

與 -h 選項相似,但計算單位是 1000bytes 而不是 1024bytes。

--indicator-style=WORD

設定檔案類型標記,WORD 的預設值為 none,當設定為 classify 時,功能與 -F 選項相似。

-i, --inode

顯示檔案和目錄的 inode 索引數字。

-I, --ignore=PATTERN

不顯示符合指定的 PATTERN 檔案。

-k

等同 --block-size=1K 選項

-l

檔案資料以詳細格式顯示。欄位依序是 使用權限、硬連結數目、擁有者、群組名稱、大小、最後

修改時間、檔名

-L, --dereference

顯示符號連結目錄的檔案內容。

-m

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 97

dir

以逗號(,)作區隔字元。

-n, --numeric-uid-gid

相似 -l 選項,但顯示 UIDs 與 GIDs 數字

-N, --literal

顯示檔案和目錄名稱,包括控制字元。

-o

相似 -l 選項,但不顯示檔案的群組資訊。

-p, --file-type

檔名後附上代表檔案類型的特殊符號。與 -F 選項相似,差別在對可執行檔案不附加 * 符號。

-q, --hide-control-chars

顯示時使用問號(?)代替取代非圖形字元。

--show-control-chars

顯示非圖形字元。

-Q, --quote-name

將顯示的檔名用括號("")括起來。

--quoting-style=WORD

將符合指定 WORD 型態的檔名顯示時以括號括起來。WORD 有 literal, locale, shell,

shell-always, c, escape 等。

-r, --reverse

顯示檔名以降羃排序處理。

-R, --recursive

顯示"子目錄"的檔案資料。

-s, --size

顯示檔案所佔用的 blocks 大小

-S

以檔案的大小排序

--sort=WORD

設定排序型態。可指定的型態以及顯示的選項等效如後,extension -X, none -U, size -S, time

-t, version -v, status -c, time -t, atime -u, access -u, use -u

--time=WORD

自訂時間型態資料,取代原本的異動時間顯示。WORD 型態有 atime, access, use, ctime, status

--time-style=STYLE

自訂顯示時間格式,STYLE 有 full-iso, long-iso, iso, locale, +FORMAT

-t

以檔案的異動時間排序

-T COLS, --tabsize=COLS

設定跳格的寬度(預設值 8)

-u

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 98

dir

與 -lt 選項搭配時,顯示"最後存取時間",並以她來排序;與 -l 選項搭配時,顯示"最後存取

時間",以檔名排序;其他使用,以"最後存取時間"排序

-U

不排序,顯示先後以目錄檔(.)紀錄的次序為依據

-v

以"版本"排序

-w COLS, --width=COLS

自訂螢幕顯示行的長度(COLS 預設值來自終端機的環境設定,其次則來自環境變數 COLUMNS,如

果沒有相關設定,預設值將為 80)

-x

資料顯示次序是,由行左至行右,再由上而下。

-X

以"副檔名"(extension)的字母次序排序。

-1

單列顯示

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

吼!辛苦了,讓您捲到這裡!真不知道那個邊想邊打字的笨蛋到底在想什麼!

指令現存的選項裡,有一部分相似甚至是重疊的,其實交談環境下只要掌握自己想的知道的資訊,

認識該用的選項,大概就可以了。看倌們,就青菜蘿蔔,各取所好吧。

實際範例

注意環境的預設值

通常使用 dir 指令多半屬慣用 DOS 環境的使用者。對多數的 GNU/Linux 系統而言,多半都會忽

略 dir 而只對 ls 指令做了完善的環境設定。如 dircolors 的使用就是一例。

# alias ls

alias ls='ls --color=tty'

#

上頭是 RedHat 9.0 系統預設值。這個 alias 寫在 /etc/profile.d/colorls.sh 當中。如果使

用 csh, tcsh 則設定在 /etc/profile.d/colorls.csh。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 99

dir

你會發現沒有對 dir 做類似的設定,所以如果您慣用 dir 指令,這個環境你得自己處理。簡單

地在您的 ~/.bashrc 中設定 alias 即可。

其他的運用實例請參考 ls 指令,在此就不多做贅述了。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 100

dircolors

dircolors

指令語法

dircolors [OPTION]... [FILE]

指令說明

這是指令相當特別,她主要功能在於輸出一段關於 ls 指令顯示顏色的變數設定值。目前支援

bash 與 tcsh,在 linux 環境中,相當於支援 sh, bash, csh, tcsh。

選項說明

-b, --sh, --bourne-shell :列出 bash (sh) 的 LS_COLORS 變數設定

-c, --csh, --c-shell :列出 tcsh (csh) 的 setenv LS_COLORS 環境變數設

-p, --print-database :列出設定檔案的內容。

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

運作說明

RedHat 7.3 中,系統有 bash 的預設環境,檔案是 /etc/bashrc ,其中有這麼一段描述

if [ "x$SHLVL" != "x1" ]; then # We're not a login shell

for i in /etc/profile.d/*.sh; do

if [ -r "$i" ]; then

. $i

fi

done

fi

是這段讓你在 login 後每開啟新的 shell 時都去讀取與執行 /etc/profile.d 目錄下的

*.sh。在當中,有一個相關於 dircolors 的 shell script,名稱是 colorls.sh。她的內容如下,

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 101

dircolors

# cat -n colorls.sh

1 # color-ls initialization

2 COLORS=/etc/DIR_COLORS

3 eval `dircolors --sh /etc/DIR_COLORS`

4 [ -f "$HOME/.dircolors" ] && eval `dircolors --sh $HOME/.dircolors` &&

COLORS=$HOME/.dircolors

5 [ -f "$HOME/.dir_colors" ] && eval `dircolors --sh $HOME/.dir_colors` &&

COLORS=$HOME/.dir_colors

6

7 if echo $SHELL |grep bash 2>&1 >/dev/null; then # aliases are bash only

8 if ! egrep -qi "^COLOR.*none" $COLORS &>/dev/null; then

9 alias ll='ls -l --color=tty'

10 alias l.='ls -d .[a-zA-Z]* --color=tty'

11 alias ls='ls --color=tty'

12 else

13 alias ll='ls -l'

14 alias l.='ls -d .[a-zA-Z]*'

15 fi

16 fi

17

#

第二行,設定變數 COLORS,給於初始值 /etc/DIR_COLORS。

第三行,以 shell 的內建指令 eval 執行 dircolors 的輸出。到此初步完成系統的預設值。

第四、五行,檢測使用者的 home 目錄下是否有自己的 dircolors 參數設定檔 ".dircolors" 或

".dir_colors",如果有,再次使用 eval 執行 dircolors 的設定。到此完成使用者自己的

dircolors 設定。

第七到十六行,設定 ls 指令的別名(aliases)。

以上即是 bash 運作預設的 dircolors 流程。認知,理解這個流程,有助於掌握設定。接下來讓

我們來看設定 dircolors 顏色顯示的資料檔,樣本是安裝時檢附的原始設定檔案

/etc/DIR_COLORS。

[root@www etc]# cat -n DIR_COLORS

1 # Configuration file for the color ls utility

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 102

dircolors

2 # This file goes in the /etc directory, and must be world readable.

3 # You can copy this file to .dir_colors in your $HOME directory to override

4 # the system defaults.

5

6 # COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not

7 # pipes. 'all' adds color characters to all output. 'none' shuts colorization

8 # off.

9 COLOR tty

10

11 # Extra command line options for ls go here.

12 # Basically these ones are:

13 # -F = show '/' for dirs, '*' for executables, etc.

14 # -T 0 = don't trust tab spacing when formatting ls output.

15 OPTIONS -F -T 0

16

17 # Below, there should be one TERM entry for each termtype that is colorizable

18 TERM linux

19 TERM console

20 TERM con132x25

21 TERM con132x30

22 TERM con132x43

23 TERM con132x60

24 TERM con80x25

25 TERM con80x28

26 TERM con80x30

27 TERM con80x43

28 TERM con80x50

29 TERM con80x60

30 TERM cons25

31 TERM xterm

32 TERM rxvt

33 TERM xterm-color

34 TERM color-xterm

35 TERM vt100

36 TERM dtterm

37 TERM color_xterm

38

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 103

dircolors

39 # EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)

40 EIGHTBIT 1

41

42 # Below are the color init strings for the basic file types. A color init

43 # string consists of one or more of the following numeric codes:

44 # Attribute codes:

45 # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed

46 # Text color codes:

47 # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white

48 # Background color codes:

49 # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white

50 NORMAL 00 # global default, although everything should be something.

51 FILE 00 # normal file

52 DIR 01;34 # directory

53 LINK 01;36 # symbolic link

54 FIFO 40;33 # pipe

55 SOCK 01;35 # socket

56 BLK 40;33;01 # block device driver

57 CHR 40;33;01 # character device driver

58 ORPHAN 01;05;37;41 # orphaned syminks

59 MISSING 01;05;37;41 # ... and the files they point to

60

61 # This is for files with execute permission:

62 EXEC 01;32

63

64 # List any file extensions like '.gz' or '.tar' that you would like ls

65 # to colorize below. Put the extension, a space, and the color init string.

66 # (and any comments you want to add after a '#')

67 .cmd 01;32 # executables (bright green)

68 .exe 01;32

69 .com 01;32

70 .btm 01;32

71 .bat 01;32

72 .sh 01;32

73 .csh 01;32

74 .tar 01;31 # archives or compressed (bright red)

75 tgz 01;31

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 104

dircolors

76 .arj 01;31

77 .taz 01;31

78 .lzh 01;31

79 .zip 01;31

80 .z 01;31

81 .Z 01;31

82 .gz 01;31

83 .bz2 01;31

84 .bz 01;31

85 .tz 01;31

86 .rpm 01;31

87 .cpio 01;31

88 .jpg 01;35 # image formats

89 .gif 01;35

90 .bmp 01;35

91 .xbm 01;35

92 .xpm 01;35

93 .png 01;35

94 .tif 01;35

[root@www etc]#

以上這個檔案格式說明,清楚地紀錄在 On-line manual dir_colors (5) 當中,想詳細參閱的人

可使用 man 指令查閱

# man 5 dir_colors

目前農夫較關注顏色設定部份,所以我僅說明這一部份。顏色與號碼的對應,源自於 ISO 6429 裡

的定義。參考的資料入下

0 to restore default color

1 for brighter colors

4 for underlined text

5 for flashing text

30 for black foreground

31 for red foreground

32 for green foreground

33 for yellow (or brown) foreground

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 105

dircolors

34 for blue foreground

35 for purple foreground

36 for cyan foreground

37 for white (or gray) foreground

40 for black background

41 for red background

42 for green background

43 for yellow (or brown) background

44 for blue background

45 for purple background

46 for cyan background

47 for white (or gray) background

事實上,你會發現原檔案的 44 ~ 49 行歸類的比較清楚,以下,我直接用他們來加上中文。

44 # Attribute codes: # 顯示屬性碼

45 # 00=預設值 01=粗體 04=底線 05=閃爍 07=反轉 08=隱藏

46 # Text color codes: # 文字顏色碼

47 # 30=黑 31=紅 32=綠 33=黃 34=籃 35=紅紫 36=墨綠 37=白

48 # Background color codes: # 文字底色碼

49 # 40=黑 41=紅 42=綠 43=黃 44=籃 45=紅紫 46=墨綠 47=白

這是顏色定義的部份。

50 ~ 59 行,是相關於何種檔案對應何種顏色的描述。66 ~ 94 行,是關於文件副檔名分類的顏

色對應。這兩者的設定格式相同

檔案型態簡碼 色碼:色碼:色碼

所有詳細的檔案型態簡碼可在 dir_colors 中查得,不再贅述。色碼雖有三種型態但沒有重複,

所以使用上最多三個,可以不分次序,但必須以";"加以隔開。

想建立自己的顏色設定,最好還是將 /etc/DIR_COLORS 拷貝一份到自己的 home 目錄,檔名命名

".dircolors"或".dir_colors",然後使用 vi 修改自己的檔案即可。原範例檔案

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 106

dircolors

(/etc/DIR_COLORS )是最佳樣本。有興趣、有需要時,不訪試試自己調調看。當然,別忘了,有"

拷貝",就有"保佑"。

這篇就寫到這裡了。

指令相關的系統設定檔案

/etc/bashrc

/etc/csh.cshrc

/etc/DIR_COLORS

/etc/profile.d/colorls.csh

/etc/profile.d/colorls.sh

$HOME/.dircolors

$HOME/.dir_colors

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 107

dirname

dirname

指令語法

dirname NAME

dirname OPTION

指令說明

指令的作用在於取得路徑。當你輸入一個絕對路徑的檔案時,指令將只顯示她的目錄路徑。這種

作用在撰寫 shell script 時較常用,交談環境下運用的時機相當少。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實際範例

得到你需要的目錄路徑

# dirname /etc/httpd/logs/access_log

/etc/httpd/logs

# dirname access_log

.

#

這個指令會你所輸入的引數刪除尾部的檔名,然後結果送到標準輸出。但當引數沒有路徑時,則

直接輸出當前目錄的符號(.)。

注意一個問題

# dirname /etc/httpd/logs/access_log

/etc/httpd/logs

# dirname /etc/httpd/logsssss/access_log

/etc/httpd/logsssss

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 108

dirname

# dirname access_log1234

.

# ls access_log1234

ls: access_log1234: 沒有此一檔案或目錄

#

這個指令目前並不對你所輸入的引數作確認。也就是說,當你輸入一個根本不存在的路徑或檔名

時,她還是會依據你所給的引數,刪除尾部,然後結果送到標準輸出。所以請注意到,dirname 指

令並不做檔案或目錄的存在確認,這是目前使用上必須注意的地方。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 109

dirs

dirs

指令語法

bash

dirs [-clpv] [+n] [-n]

tcsh

dirs [-l] [-n|-v]

dirs -S|-L [filename] (+)

dirs -c (+)

指令說明

dirs 主要的功能在於顯示目錄堆疊的資料。bash 與 tcsh 的指令用法有些小差異,但實質上的

作用則是完全相同。

關於目錄堆疊的使用,除了用 dirs 顯示目錄堆疊,還有兩個相關的內建指令,pushd 指令用來

將目錄放入堆疊中,以及 popd 指令將目錄從堆疊中移除。

選項說明

bash

+n

顯示從左到右的第 n 個目錄。數字從 0 開始。

-n

顯示從右到左的第 n 個目錄。數字從 0 開始。

-c

淨空堆疊表列。

-l

顯示完整路徑。(預設值會將使用者個人的 home 目錄以 ~ 符號表示)。

-p

一個目錄一行地顯示堆疊的內容。

-v

每行一個目錄的顯示目錄堆疊的內容, 每個目錄前面加上它在目錄堆疊中的編號。

tcsh

-l

顯示完整路徑。(預設值會將使用者個人的 home 目錄以 ~ 符號表示)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 110

dirs

-n

當顯示路徑超過螢幕寬度時,會自動換行以保持目錄的完整。

-p

顯示目錄堆疊。(指令的預設值)。

-v

每行一個目錄的顯示目錄堆疊的內容, 每個目錄前面加上它在目錄堆疊中的編號。

-S filename

將當前的"目錄堆疊"轉存到指令的 filename。當需要時可以利用 filename 重建當前的目錄堆

疊。 如果沒有指定 filename,資料會轉存到 ~/.cshdirs 檔案。

-L filename

讀取指定的 filename 重建目錄堆疊。 如果沒有指定 filename,指令將自動找尋 ~/.cshdirs 檔

案來建立目錄堆疊。

-c

淨空堆疊表列。

相關指令

popd, pushd

實例說明

bash

# dirs

/home/web /var/lib/mysql /etc/httpd /etc/httpd/logs

# dirs -v

0 /home/web

1 /var/lib/mysql

2 /etc/httpd

3 /etc/httpd/logs

#

使用 dirs 不加上任何選項,即顯示當前"目錄堆疊"的現況。加上 -v 選項則以另一種格式顯示。

# dirs +1

/var/lib/mysql

# dirs -2

/var/lib/mysql

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 111

dirs

基本上,目錄堆疊不管從左到右,或從右到左,都是從 0 開始計算。指令 dirs 做的只是"顯示"

指定的堆疊內容,如果要 cd 到該目錄,可以改用 pushd 指令。

tcsh

除了基本的顯示功能與 bash 相同外。tcsh 的 dirs 支援一項目錄堆疊資料儲存與重建的功能。

$ dirs -v

0 ~/akbin

1 /etc/rc1.d

2 /home/SourceCode

3 /home/web/MyWork-FarmerFdoc

4 ~

5 /var/log

6 /home

7 /etc/httpd/logs

$ dirs -S

選項 -S 可以讓我們將當前的目錄堆疊儲存起來。使用這個選項,可以指定一個存檔的檔名,當

不指定檔名時,資料會自動存到 ~/.cshdirs 這個預設的檔名。

$ cat ~/.cshdirs

cd /etc/httpd/logs

pushd /home

pushd /var/log

pushd /root

pushd /home/web/MyWork-FarmerFdoc

pushd /home/SourceCode

pushd /etc/rc1.d

pushd /root/akbin

$

這就是用來重建目錄堆疊的 ~/.cshdirs 檔案內容。當下次 login 或想回復當前設定時,我就可

以簡單的方式來重建儲存的目錄堆疊

$ dirs -L

$ dirs -v

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 112

dirs

0 ~/akbin

1 /etc/rc1.d

2 /home/SourceCode

3 /home/web/MyWork-FarmerFdoc

4 ~

5 /var/log

6 /home

7 /etc/httpd/logs

$

這是相當有用的功能。其實在 bash 環境下,也可以使用 source 來執行 ./cshdirs 或其他藉由

-S 選項產生的目錄堆疊檔案。這樣做同樣可以重建我們存起來的目錄堆疊環境。這篇就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 113

dos2unix

dos2unix

指令語法

dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]

指令說明

聽名字,就能肯定是個"老芋頭"指令。在電腦硬體日新月異,微軟三不五時改名換版(賺新錢)的

情況下,這個 UNIX 時代的指令,如今還依然行不改名,坐不改姓地能存活在這個新的 Linux 年

代。

有時上網閒逛,爾偶會看到有人詢問文字檔中,每行結尾多了個 ^M....我腦裡

就浮現,年老的麥克阿瑟將軍面對著西點軍校的青年學子們做最後演說,麥帥

以一首滄傷的軍歌歌詞作演說的結尾:Old soldiers never die, They only fade

away (老兵不死,只是凋零) ...

DOS 的文字檔案,列的結束符號有二個字元,一個是歸位字元 (carriage return,^M),另一個

是換列字元 (new line,^J)。但 UNIX 只使用一個新列字元 \n (^J)。所以當 DOS 的文字檔傳

到 UNIX(BSD, Linux 也一樣) 中,以 vi 編輯時,會發現每行的結尾都出現一個特殊符號 ^M。

因此這個指令做的就是將 DOS 文字檔案裡的行尾符號(^M^J)轉換成 Unix 的行尾符號(^J)。

如果發現系統裡沒有這支程式,使用者就必須自己安裝了。

選項說明

-h --help

顯示程式用法資訊。

-k --keepdate

轉檔保留原檔案的日期標示。

-q --quiet

安靜模式。不顯示任何訊息。

-c --convmode convmode

模擬 SunOS 下的 dos2unix 轉換模式。 支援的轉換模式有 ASCII, 7bit, ISO, Mac。

-o --oldfile file ...

原檔名模式。這個模式也是程式的預設模式。轉換結果覆寫到原檔名,所以不會產生新檔案。檔

名可使用萬用字元(Wildcard)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 114

dos2unix

-n --newfile infile outfile ...

新檔案模式。將轉換的結果存到指定的檔名。注意: infile 萬萬不可使用萬用字元(Wildcard)。

因為 outfile 無法相對支援,會造成部分檔案遺失的嚴重後果。

實例說明

指令支援一次多個檔案轉檔。

# dos2unix d-data1.txt d-news1.txt d-udfile.txt

dos2unix: converting file d-data1.txt to UNIX format ...

dos2unix: converting file d-news1.txt to UNIX format ...

dos2unix: converting file d-udfile.txt to UNIX format ...

#

如果待轉檔的檔名有關聯性,也可以使用萬用字元來處理。

# dos2unix d-*

dos2unix: converting file d-data1.txt to UNIX format ...

dos2unix: converting file d-news1.txt to UNIX format ...

dos2unix: converting file d-udfile.txt to UNIX format ...

#

有需要轉新檔保留原檔時,可以使用 -n 選項

# dos2unix -n d-data1.txt u-data.txt

dos2unix: converting file d-data1.txt to file u-data.txt in UNIX format ...

#

這個 -n 選項,萬萬不可使用萬用字元,會造成檔案遺失。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 115

du

du

指令語法

du [OPTION]... [FILE]...

指令說明

顯示指定的檔案或目錄(連同底下的子目錄)所佔用的磁碟空間總計。如果指令沒有任何引數,則

顯示當前的工作目錄總計。指令顯示的單位預設值為 block(1024 Bytes)。

選項說明

-a, --all

顯示所有統計的檔案與目錄資料。(預設值僅顯示目錄資料)

--block-size=SIZE

自訂 SIZE 大小做為區塊(block)的計量單位。

-b, --bytes

以 bytes 為顯示單位

-c, --total

增列一行 "總計"

-D, --dereference-args

顯示並統計指定的符號連結路徑

-h, --human-readable

以 K, M, G 為計量單位,選項名稱取叫"人看"(哈!)

-H, --si

與 -h 選項相似,但以 1000 為單位,非 1024。

-k, --kilobytes

同 --block-size=1024

-l, --count-links

對硬連結(hard link)的目錄或檔案,採累計方式(連幾次就算幾次) 。

-L, --dereference

顯示所有符號連結(symbolic links)

-m, --megabytes

同 --block-size=1048576

-S, --separate-dirs

總計時忽略不計子目錄

-s, --summarize

只顯示總計

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 116

du

-x, --one-file-system

以第一個引數所在的檔案系統為準,排除顯示與計算位於不同檔案系統的目錄或檔案

-X FILE, --exclude-from=FILE

指定讀取檔名(文字檔案),排除計算其內容描述的目錄或檔案

--exclude=PAT

指定不列入計算的目錄或檔案

--max-depth=N

設定顯示子目錄的層數。當 N 為 0 時,相當於 --summarize 選項。

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

顯示、不顯示 都沒問題

大多數,我們在交談環境下使用 du 想知道的,通常就是目錄所佔用的空間大小。由於 du 指令

的預設值會顯示檔案與子目錄的資料,所以顯示的資料可能是一長串不必要的無關資訊。因此,

適度將上 -s 選項是一個不錯的選擇。

# du -s /home/web

7942616 /home/web

#

有時可能因特殊的需求,或者一時頭殼壞掉,想要顯示子目錄的資訊。這種情況,能滿足這項需

求的是選項 --max-depth=N。這個選項我們可以設定顯示子目錄的層數。

# du --max-depth=2 /home/web

968 /home/web/nuke/admin

144 /home/web/nuke/blocks

228 /home/web/nuke/glib

2804 /home/web/nuke/images

1376 /home/web/nuke/includes

24 /home/web/nuke/language

6932 /home/web/nuke/modules

4352 /home/web/nuke/themes

.......

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 117

du

這種選項的顯示帶了點 tree 的味道....

人性的單位顯示 選項 -h

du 指令的預設單位是 block(1024 bytes, 有些 UNIX 系統是以 512 bytes 為預設值)。如果你

認為看這個單位不人道,那可以使用 -h 選項

# du -sh /home/web

7.6G /home/web

#

總計的部分換成 7.6G 來顯示,或與這對多數人的感受上是比較有意義的。

這個指令的功能組合,可以應付相當多種不同性質的需求。選項實例的說明暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 118

echo

echo

指令語法

echo [OPTION]... [STRING]...

指令說明

將設定字串送到標準輸出

選項說明

-n :不輸出換行的字元(所以游標會停在輸出訊息的後面)

-e :啟用解譯下列的特定倒斜線字元組合

\\ 倒斜線(backslash)

\a 警示聲 (BEL)

\b 游標倒退一格字元(backspace)

\c 在行尾不加上換行字元(同 -n 選項的作用)

\f 換頁(form feed)

\n 換行(new line)

\r 游標回歸行首(carriage return)

\t 水平跳格(horizontal tab)

\v 垂直跳格(vertical tab)

-E :取消解譯特定的倒斜線字元組合

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

使用與範例說明

echo 指令與 bash, tcsh 內建指令 echo 的關係說明

關於使用 echo 這個指令,首先得注意你執行的是 shell 的內建指令還是現在正為您介紹的這個

"外部"指令

# echo --version

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 119

echo

--version

沒有如預期顯示出版本的訊息,既表示這時候執行的 echo 是 shell 的內建指令。其實不管你使

用的是 bash 或者是 tcsh,也不管您的 path 是如何設定,當外部指令的名稱與內建指令名稱相

同時,內建指令都是優先執行的。

因此,如果你想執行外部的 echo 指令,你得知道指令的絕對路徑

# which echo

/bin/echo

# /bin/echo --version

echo (GNU sh-utils) 2.0.11

Written by FIXME unknown.

Copyright (C) 2000 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#

可以清楚地看到,這指令是"牛伯伯"的傑作。

其實,這個 echo 指令的語法和"牛伯伯"的 bash shell (version 2.05a) 是相同的,所以您學

習這個指令,也就相當於在學習 bash 的 echo 語法。如果你問,這兩者有沒有不同的地方,答

案是沒有差,但 bash 內建的 echo 功能多了一項功能,他額外支援 16 進位 ASCII 碼的字元組

合顯示。所以 bash 的使用者沒有刻意執行 /bin/echo 的必要,使用內建的 echo 就可以了。

至於 tcsh 內建的 echo 功能則較 /bin/echo 簡單,因此對 tcsh 的使用者而言 /bin/echo 的

存在就顯得較具份量。

就指令執行效率的角度來看,內建指令要比外部指令來的好。所以如果沒有特殊理由的話,沒有

必要捨棄內建指令而刻意去執行功能相同的外部指令。

tcsh 的使用者要執行外在指令 echo ,除了使用絕對路徑之外,還有一個方法可以讓我們暫時會

永久地將外部指令 /bin/echo 取代 shell 的內建指令 echo ,就是設定 aliases(別名),手動

(暫時)的作法下

$ alias echo "/bin/echo"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 120

echo

當然,您也可以將他寫在 .cshrc 或 .aliases 等起始檔案中,省去手動設定的步驟。

變數內容顯示

這是個 echo 指令相當基礎的應用。

# /bin/echo $LANG

zh_TW.Big5

#

不換行(等待輸入)的字串

這是撰寫 script 時常會用到的 echo 型態,讓大家看個農夫我撰寫中的極機密檔案

# cat -n echo-01

1 #!/bin/bash

2

3 echo -n "請輸入你的名字:"

4 read _fathead1

5

6 echo -en "\n 喔,\n 原來是你 $_fathead1.\n\n 我知道,你就是你爸爸的兒子,我說的對不對:"

7 read _fathead2

8

9 echo -e "\n 好,請投十塊到軟碟入口的位置\n 大仙我將為你解答人生所有的疑惑."

10 sleep 3

11 echo -e "\n 快!投五十塊的也可以."

12 sleep 3

13 echo -e "\n 如果你沒有零錢,請塞入一千塊紙鈔本大仙會自動找零錢給你.\n 快!把握你人生

的仙緣"

14 sleep 3

15 echo -e "\n 我等你.\n 快!$_fathead1 錢乃身外之物.\n 能捨!才能得!!\n"

16 下略.....

第三行就是不換行,等待輸入的 echo 指令使用...對了,這個極機密程式已經撰寫終結,如有需

要請 e-mail 與本人接洽,快!五千元塊就夠了。

有聲的警示訊息

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 121

echo

# /bin/echo -e "錢還沒收到. 快! \a"

會發出 R2D2 的聲音喔,這篇就簡單到此了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 122

eject

eject

指令語法

eject -h

eject [-vnrsfqp] [<name>]

eject [-vn] -d

eject [-vn] -a on|off|1|0 [<name>]

eject [-vn] -c slot [<name>]

eject [-vn] -t [<name>]

eject [-vn] -x <speed> [<name>]

eject -V

指令說明

指令的做用,正如其名"彈出來"。這個指令坐飛機時,千萬別輕易使用。

選項說明

-h

顯示程式用法資訊

-v

顯示程式運作的所有過程

-d

顯示預設的裝置名稱。

-a on|1|off|0

自動跳出功能的開啟與關閉

-c <slot>

切換光碟櫃內的光碟片

-t

收回開啟的光碟機托盤(此選項視光碟機本身的支援而定)

-x <speed>

設定光碟機的讀取倍數

-n

只顯示是否有找到裝置,不執行跳出動作

-r

跳出 CDROM

-s

跳出 SCSI 裝置

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 123

eject

-f

跳出軟碟機(floppy disk)

-q

跳出磁帶機 (tape drive)

-p

使用 /proc/mounts 取代 /etc/mtab

-V

顯示程式本身的版本資訊

以下是上述顯項的另一種輸入選擇,如果使用者覺得以下的單字比較好記的話,不妨考慮使用之。

但不管是長是短,功能是一樣的。

-h --help

-v --verbose

-d --default

-a --auto

-c --changerslot

-t --trayclose

-x --cdspeed

-n --noop

-r --cdrom

-s --scsi

-f --floppy

-q --tape

-V --version

-p --proc

實例說明

對一般使用者來說,電腦配備大多僅一到兩台的 CD 或 DVD,所以其實大多數的選項都沒有太多

的使用機會。如今,有點高興地也有點不幸地,農夫的主機上只有一台"老"光碟機,沒有先進的

光碟櫃可玩,所有因設備簡單而簡單地介紹這個指令

# eject

在我簡陋的主機上因為只有一台老光碟機所以只要簡單的 eject 指令既主動開啟光碟機(簡單有

時不算是一件壞事)。如果您的主機上有軟碟、光碟甚至是 SCSI 的裝置,下指令時最好給予特定

的選項。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 124

eject

# eject -t

收回光碟基托盤。當然,是否收的回來得看您的硬體裝置是否支援才行(萬一收不回來,建議你把

它丟掉,重買一台,最重要的是請順便告訴我,您丟的位置。)簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 125

eval

eval

指令語法

bash

eval [arg ...]

tcsh

eval arg ...

指令說明

這是個功能特殊的指令,在一般交談模式下使用時機不多,但在撰寫 shell scrip 知道有此一指

令,有了 eval ,執行"引數"的問題就簡單許多。

eval 指令會讀入所有的 args,當成一道指令,交由 shell 執行。執行完畢後,退回原來的 shell。

實例說明

bash

以下是為了介紹 eval 的作用,臨時編的範例,

# cat -n fps

1 #! /bin/bash

2 KW=$1

3 kk="ps axu | grep "

4 echo "$kk $KW"

5 eval $kk $KW

#

這支簡陋的 scrip 做的事情很簡單,找執行程序的特定字串。相當於我們下 "ps axu | grep

pattern" 這麼一道組合指令。

在第 5 行,我使用了 eval 指令來執行 $kk $KW 這兩個引數。如果沒有 eval 指令,老實說處

理起來就會複雜多了。希望這個簡單的例子,已足夠您理解 eval 的運用。在此建議,看倌們將

eval 拿掉,執行看看,會有什麼結果。

tcsh

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 126

eval

# cat -n fps2

1 #! /bin/tcsh

2 set KW = $1

3 set kk = "ps axu | grep "

4 echo "$kk $KW"

5 eval $kk $KW

#

以上是 tcsh 的語法,做的動作則與 bash 的範例完全相同。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 127

exec

exec

指令語法

bash

exec [-cl] [-a name] [command [arguments]]

tcsh

exec command

指令說明

shell 內建的 exec 是個執行方式較為特殊的指令。一般 shell 在解譯命令時會先 fork() 一個

子程序(child process)用來執行解譯的命令,當解譯命令 exec() 結束後,再 _exit() 終結子

程序並回傳狀態值,回到父程序(parent process);但 exec 內建指令不做 fork(),而是直接解

譯命令的執行,因此原 shell 程序被解譯命令的執行所替換,當執行終結時,如果原 shell 是

一個 subshell 則會回到她的 parent shell,如果原 shell 是 login shell 則回到她的 parent

也就是 login 程式(換句話說,你 logout 了)。

以上的 fork(), exec(), _exit() 這些 system calls 是位於程式與 kernel

之間的運作,如果使用者有興趣近一步釐清與掌握這些觀念,建議閱讀關於

kernel 的 processes 章節。或許這些非關於指令操作,但實際上並不然,無

法清楚這些 processes 的基礎觀念,既可能無法正確運用 exec 內建指令。

這個指令通常用在 shell script 的最末執行。也用在一般交談模式下變換 shell 的執行(當然,

使用者必須清楚為何要這樣用的理由;因為不用 exec 也可以改變使用的 shell)。

選項說明

bash

-l

在引數 0 的開頭加上 - 符號 (供 login 指令使用)。

-c

指定的指令將在空環境下執行

-a name

以 name 作為指令執行的第 0 個引數。

tcsh

庵不囉唆,沒有選項。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 128

exec

實例說明

bash

# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 5641 5640 0 75 0 - 1287 wait4 tty5 00:00:00 bash

0 R 0 5679 5641 0 75 0 - 774 - tty5 00:00:00 ps

#

這是在 login shell 下簡單的 process 顯示,可以清楚看到 目前 login shell 的 PID 是

5641。她的父程序(PPID) 是 5640。讓我們來看看這個 PID 執行的是什麼東東

# ps 5640

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 5640 1 0 75 0 - 545 wait4 ? 0:00 login -- root

#

清楚這點以後,讓我們來玩玩 exec

# exec tcsh

我簡單地用 exec 來執行 tcsh,然後讓我們再來看看

# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 R 0 5641 5640 0 75 0 - 1337 - tty5 00:00:00 tcsh

0 R 0 5699 5641 0 75 0 - 775 - tty5 00:00:00 ps

#

PID 5641 依舊存在,但指令名稱已經改變成 tcsh 了。這即是使用 exec 的作用。理解她實際上

的效應後,使用她在 shell script 時,你就可以想像她會得到什麼效應了。這點是 tcsh 中也

是相同的。無妨在自己的系統上玩玩看。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 129

exit

exit

指令語法

bash

exit [n]

tcsh

exit [expr]

指令說明

exit 是個常用的內建指令。在交談模式下,我們用她來結束當前 shell 程序的執行。在 shell

script 中,我們用他來退出 shell script,通常也會順便指定一個退出的狀態值,供我們查驗

shell script 的執行情況。

實例說明

bash

# bash

# exit 16

exit

# echo $?

16

#

上例,我刻意在交談模式下執行一個 subshell,然後使用 exit 並給於一個 16 的狀態值,退出

subshell 的執行。然後,使用 echo 來顯示上個指令的執行狀態值,得到了 16 的答案。

在 shell script 的用法相同,就不在特別舉例了。

tcsh

$ tcsh

$ exit 1

exit

$ echo $status

1

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 130

exit

$

上例,做法與 bash 相同。你可以發現,tcsh 的執行狀態顯示與 bash 不同,這大致是唯一的差

異。

在 login shell

如果我們在 login shell 中使用 exit,其作用相當於 logout。這點,通用在多數的 shell。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 131

export

export

指令語法

export [-fn] [name[=word]] ...

export -p

指令說明

宣告環境變數供目前的 shell 以及所有的子程序(child processes)運用。

選項說明

-f name

宣告"函數"。如果沒有帶入函數名稱,則顯示已宣告的函數。

-n name

解除變數宣告。如果沒有指定名稱,但與 -f name 合用,將會解除函數宣告。

-p

列出所有的變數宣告。

實例說明

環境變數的宣告與解除

如果我們需要把一般變數轉成環境變數,使用 export 該變數名稱就可了。來看個例子

# FV1=LKK

# export FV1

上面,是一種宣告方式,我們也可以使用如下的語法

# export FV2=LKK

想要解除宣告的話,語法如下

# export -n FV1 FV2

函數的宣告與解除

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 132

export

bash 的函數可以像環境變數一樣,藉由 export 宣告後,讓 shell 的所有子程序獲得宣告函數

的繼承使用。為了簡化舉例,我直接在交談模式下,建一個簡單的函數 FF1,然後我使用 export

宣告她。

# FF1()

> {

> echo "bash function"

> }

# export -f FF1

讓我們來看看是否宣告成功?

# export -f

FF1 ()

{

echo "bash function"

}

declare -fx FF1

#

沒問題,宣告成功了。讓我們執行看看

# FF1

bash function

#

也沒問題。最後,我們將這個已宣告的函數解除

# export -n -f FF1

# export -f

#

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 133

expr

expr

指令語法

expr EXPRESSION

expr OPTION

指令說明

通常 expr 用在撰寫 shell script 中。一般的交談環境用到的機會不大。她支援整數的四則運

算 (加、減、乘、除);判別比較數值的大小(支援浮點數);以及較為特殊的字串處理(有點類似 grep

pattern 的字串特殊處理)等等。

從適用性的角度來看, expr 指令所提供的演算式,大體上是在彌補 shell 內建演算功能的不

足。在撰寫 shell script 時,最好僅可能運用 shell 本身已經內建的演算功能,這在執行效率

上會比較好。其次,才是使用像 expr 這種外部指令。所以,最恰當的運用是先熟悉 shell 本身

的運算式支援,以使用她們為優先,不足時再使用 expr 指令。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

以下是支援的運算式語法說明

ARG1 | ARG2

同 OR 邏輯

ARG1 & ARG2

同 AND 邏輯

ARG1 < ARG2

ARG1 小於 ARG2

ARG1 <= ARG2

ARG1 小於或等於 ARG2

ARG1 = ARG2

ARG1 等於 ARG2

ARG1 != ARG2

ARG1 不等於 ARG2

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 134

expr

ARG1 >= ARG2

ARG1 大於或等於 ARG2

ARG1 > ARG2

ARG1 大於 ARG2

ARG1 + ARG2

計算 ARG1 加 ARG2 的和

ARG1 - ARG2

計算 ARG1 減 ARG2 的和

ARG1 * ARG2

計算 ARG1 乘 ARG2 的和

ARG1 / ARG2

取 ARG1 除以 ARG2 的商數

ARG1 % ARG2

取 ARG1 除以 ARG2 的餘數

STRING : REGEXP

以 REGEXP 比對 STRING,顯示符合的字元數或字元。當 REGEXP 有使用 \( \) 括住時,顯示比

對符合的字元;如果沒有 \( \),則僅顯示符合的字元數。

match STRING REGEXP

同上

substr STRING POS LENGTH

對字串(STRING) 從指定的 POS(位置) 抓取指定的長度(LENGTH) 的字元,位置由 1 開始算起。

index STRING CHARS

檢索 CHARS 在 STRING 的位置,如果沒有則回應 0。(CHARS 只有第一個字元有效,檢索時也只

回應第一個符合的位置)

length STRING

計算 STRING 的長度

+ TOKEN

對指定的 TOKEN 當成字串來顯示。

( EXPRESSION )

EXPRESSION 的值

上述的語法,每個引數間必須加上空格。在 shell 中實際運用,有時必須加上 escape 或 quote

字元,運算式才能正常工作。如代表乘法的 * 符號,在使用時必須以 \* 代入;還有四則運算時

如果想用括號 () 來先處理某段運算式時,也必須代入 \( \) 才可以;還有像比較數值的大於、

小於等符號也必須寫成為 \> \< 才行。這些都是使用上必須注意的小細節。

實例說明

關於使用的方式

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 135

expr

# expr 1 + 2 + 3

# 6

上述是 shell 交談模式下的使用方式,坦白說,我這輩子還沒這樣用過。因為我有計算機。

expr 應用在 shell script 中,通常使用的型態類似以下的 script

#!/bin/bash

echo "Arithmetic Operators\n"

sum=`expr 1 + 2 + 3`

echo "1 + 2 + 3 = $sum"

當然,這個簡單的範例,其實是農夫自己的使用慣性,僅當建議。實際,能正確得到運算結果即

可。以下部分舉例,農夫會直接在交談模式下進行範例說明,至於實際如何用在 script 中,您

自己高興順手就好。

"整數"的四則運算(加、減、乘、除)

expr 支援"整數"的加、減、乘、除運算。請看下列幾個綜合性的例子

# expr 1 + 5 - 2

# expr -5 \* 2

# expr \( 1 + 5 \) / 2

# expr \( 10 - 8 \) \* \( 5 % 2 \)

四則運算中的乘法(符號 *),在使用上必須在前面加上 escape 字元。這點務必留意。此外,由

於僅支援整數的四則運算。代入的數值不能有小數。換句話說,不支援浮點數的運算。

# expr 1.5 + 10

expr: non-numeric argument

#

關於除法的運算支援"商數"以及"餘數",這兩項必要的功能。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 136

expr

# expr 5 / 2

2

# expr 5 % 2

1

可惜的是,目前尚無法在一次得到這兩個數值。

"整數"或"浮點數"的數值大小判別

儘管 expr 只支援"整數"的四則運算,但對於比較數值大小功能卻支援"浮點數"。這增加了不少

使用上的彈性。當描述的判斷為真,遞回的狀態值為 1。反之為 0。

# expr 5 \> 2

1

# expr 3.2 \<= 1

0

# expr \( 5 % 2 \) \< 4

1

千萬記得在大或小於的符號前面加上 escape 字元。如果忘了加上的話,大或小於的符號會被

shell 解譯成為 I/O Redirection 的功能。由於這也是合理的用法,所以當我們忽略時,根本就

不會有錯誤訊息產生,只得到個莫名其妙的錯誤結果。使用時務必謹慎。

"文字"的大小判別

當我們使用大小判別的符號,但代入的不是數字時,expr 將會以文字的型態來處理。

# expr A \> a

1

# expr a \> 9

基本上字元的順序得看 LC_COLLATE 這個與字元順序、字串比較相關的環境變數而定。坦白說,

農夫自己對這方面的認知有限,就個人的繁體中文環境模式下,不做特別設定的話,字元的大小

順序為 Z > Y > ... > B > A > z > y > ... > b > a > 9 > 8 > ... > 0

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 137

expr

在 RH9 的中文繁體模式下, expr 也可以判別中文字元的順序...只不過,這個中文順序,恐怕能

搞的清楚了人,恐怕不多....

# expr 一 \< 三

1

# expr 我 \> 你

1

# expr 一 \> 二

0

坦白說,農夫認為這個用途與做法,知道無妨,忘了也可。我自己曾經想用這個方法來判別中文

字元的筆劃排序,只是不清楚能否得到絕對正確的結果? (如果有高人知道答案,務必懇請賜教)

處理字串

expr 支援的字串的處理能力。大體上為以下幾種型態,

判別字串是否相同

計算字串的長度

裁減字串的長度

檢索指定字元在字串中的位置

顯示字串

以下是農夫臨時寫的簡略範例,充當是語法參考吧。

# cat ./expr-02

#!/bin/bash

ft1=fstring

ft2=0123456789abcde

ft3=abcdefghijkl

ft4=0123789abcde

echo "#Comparison Operators:"

if [ `expr $ft1 = fstring` ]

then

echo "\$ft1 is fstring"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 138

expr

fi

echo

echo "#String Operators:"

echo "The string being operated upon is \"$ft2\"."

lft2=`expr length $ft2`

echo -e "Length of \"$ft2\" is $lft2.\n"

echo "#Index Operators:"

ift=`expr index $ft3 k10`

echo -e "Numerical position of first \"k\" in \"$ft3\" is \"$ift\".\n"

echo "#substr Operators:"

bft=`expr substr $ft3 2 6`

echo -e "Substring of \"$ft3\", starting at position 2,\n and 6 chars long is \"$bft\".\n"

echo "#match Operstors:"

mft=`expr match "$ft4" '[0-9]*'`

echo "1. Number of digits at the beginning of \"$ft4\" is $mft."

mft2=`expr match "$ft4" '\([0-9]*\)'`

echo "2. The digits at the beginning of \"$ft4\" are \"$mft2\"."

#

以下是上例的執行結果

[root@www Fman]# ./expr-02

#Comparison Operators:

$ft1 is fstring

#String Operators:

The string being operated upon is "0123456789abcde".

Length of "0123456789abcde" is 15.

#Index Operators:

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 139

expr

Numerical position of first "k" in "abcdefghijkl" is "11".

#substr Operators:

Substring of "abcdefghijkl", starting at position 2,

and 6 chars long is "bcdefg".

#match Operstors:

1. Number of digits at the beginning of "0123789abcde" is 7.

2. The digits at the beginning of "0123789abcde" are "0123789".

[root@www Fman]#

這篇暫時到此。以後有較好的例子時再修訂。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 140

false

false

指令語法

false [ignored command line arguments]

false OPTION

指令說明

false 的功能在回應一個"偽"值。與他功能相似的是指令 true。

選項說明

--help

顯示使用說明文字

--version

顯示自身程式版本

實例說明

在執行完 false 後,echo $? 顯示的狀態直為 1 (偽值)。 一般而言,系統指令或 shell script

執行失敗的狀態值都為"偽值"。

# false

# echo $?

1

#

與 false 相似的指令有 true,他的作用則是回應"真"狀態值

# true

# echo $?

0

#

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 141

fg

fg

指令語法

bash

fg [jobspec]

tcsh

fg [%job ...]

指令說明

內建指令 fg, 屬於 job control 的範疇。她的作用在於將一個背景工作置換到前景來工作。這

是她的使用時機。關於這點,在不同的 shell 中,主要作用是相同的。

實例說明

bash

下例的環境,我預先以放了兩個指令放到背景工作中

# jobs

[1]- Stopped top -n 500 | tee Ps_A

[2]+ Stopped netstat -ct

#

當我想將背景工作 2 叫回來到前景工作,就簡單地使用 fg 指令即可

# fg 2

netstat -ct

Active Internet connections (w/o servers)

tcp 0 0 www.europa.idv.tw:http lj1074.inktomisea:52645 FIN_WAIT2

....下略

tcsh 例子

以下這部分的動作,與我在 bash 中做法相同

$ jobs

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 142

fg

[1] - Suspended (signal) top -s -n 300 |

Suspended tee fileA

[2] + Suspended netstat -ct

$

和 bash 相同,使用 fg 喚回背景工作 2

$ fg %1

netstat -ct

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 12726 www.europa.idv.tw:http adsl-dyn-tpe-62-74:1368 ESTABLISHED

....下略

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 143

file

file

指令語法

file [ -bciknsvzL ] [ -f namefile ] [ -m magicfiles ] file ...

file -C [ -m magicfile ]

指令說明

透過這個指令,我們可以檢測與辨識檔案的類型。基本上,file 指令是藉由一個 magic file 來

檢測檔案類型,這個檔案一般放在 /usr/share/ 之下(有些則放在 /etc 底下),檔名就叫

magic。所有可識別的檔案類型以及顯示的文字,都描述在這個檔案中。

以下是一部分較常見的副檔名與其說明:

壓縮與歸檔檔案

.bz2 — bzip2 壓縮的檔案

.gz — gzip 壓縮的檔案

.tar — tar (tape archive 的簡稱)壓縮的檔案,也稱為 tar 檔案

.tbz — tarred 並且 bzipped 的檔案

.tgz — tarred 並且 gzipped 的檔案

.zip — 使用 ZIP 壓縮的檔案,在 MS-DOS 的應用程式中很常見。在 Linux 中

大部份的壓縮檔案都是使用 gzip 的壓縮方式,所以 .zip 的 Linux 壓縮檔案

是不常見的。

檔案格式

.au — 音效檔

.gif — GIF 的影像檔

.html/.htm — HTML 檔案

.jpg — JPEG 的影像檔

.pdf — 文件的一個電子影像; PDF 代表 Portable Document Format

.png — PNG 的影像檔 (Portable Network Graphic 的縮寫)

.ps — PostScript 檔案; 格式化為列印使用

.txt — 純 ASCII 的文字檔

.wav — 音效檔

.xpm — 影像檔

系統檔案

.conf — 設定檔,有時候設定檔也會使用 .cfg 的副檔名

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 144

file

.lock — 鎖定檔案; 決定程式或裝置是否正在使用

.rpm — Red Hat 的套件管理員檔案,使用來安裝軟體

程式設計與程式碼檔案

.c — C 程式語言的原始碼檔案

.cpp — C++ 程式語言的原始碼檔案

.h — C 或 C++ 程式語言的表頭檔案

.o — 程式的物件檔案

.pl — Perl 的程式碼

.py — Python 的程式碼

.so — 函式庫檔案

.sh — shell 的程式碼

.tcl — TCL 程式碼

選項說明

-b

不顯示檔名。

-c

輸出 magic file 的文法解析結果。常與 -m 選項一起併用於偵錯新的 magic file。

-C

產生 magic.mgc 檔案,放在 /usr/share/ 目錄底下。檔案內容是供 file 指令做檔案類型辨識

的文法分析。

-f namefile

指定 namefile 做為檢查檔案的清單。

-i

使用 mime 模式輸出。

-k

對檔案做完所有檔案型態的辨識比對,不因已找到符合型態而停止辨識動作。

-m list

指定 magic 文件。可以是單一文件,或使用冒號分開的多個 magic 文件。

-n

每檢查一個檔案完畢,就強制更新標準輸出。僅用在檢查文件清單上,想將文件類型輸出導向管

道時使用。

-v

顯示指令版本資訊。

-z

嘗試檢驗壓縮檔內的檔案型態。

-L

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 145

file

對符號連結的檔案,檢驗符號連結所指向的原檔案。

-s

辨識特殊裝置檔案。如硬碟的分割區。

相關檔案

/usr/share/magic.mgc - 預設的 magic 編譯表列檔。

/usr/share/magic - 預設的 magic 表列檔。

/usr/share/magic.mime - 預設的 magic 表列檔(mime 輸出模式,-i 選項使用)

實例說明

當我們需要了解檔案的型態時,簡單的使用 file 指令就能達到目的

# file *

acconfig.h: ASCII C program text

acinclude.m4: ASCII M4 macro language pre-processor text

aclocal.m4: ASCII English text

ChangeLog: ASCII English text

config.guess: Bourne shell script text executable

config.h.in: ASCII C program text

config.sub: Bourne shell script text executable

...下略

指令的選項說明,多半與 magic 檔案有關。但就一般使用者的角度,系統預設的 magic,原則上

已經足夠。如果對自訂檢視檔案格式有興趣,可以自己研究一下以下的檔案

# cd /usr/share ; file mag*

magic: magic text file for file(1) cmd

magicdev: directory

magic.mgc: magic binary file for file(1) cmd (version 1) (little endian)

magic.mime: magic text file for file(1) cmd

magic.mime.mgc: magic binary file for file(1) cmd (version 1) (little endian)

#

這篇就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 146

find

find

指令語法

find [path...] [expression]

關於這個指令

find 的作用在於搜尋符合指定條件的檔案。是個支援細則繁瑣,功能強悍的檔案篩選、搜尋工具

(稱她為指令實在"小看"了些)。

以下我以指令的語法結構與功能支援做簡略的劃分與介紹:

搜尋路徑,此部份可以是相對或絕對路徑。支援指定搜尋目錄深度的選項,可

配合實際的需要使用。

搜尋的檔案條件,此部份支援我們以檔案的諸多屬性,如最後存取、改變、修

改時間,檔案大小,inode,名稱,使用者與群組的名稱或 ID,權限,甚至是

檔案所在的檔案系統的型態,均能作為找尋的條件。支援"正則表達式"的語法。

命令執行,此部份屬"附加"性質,讓我們可以直接對 find 找到的檔案,運作

指定的外部指令;譬如拷貝或刪除等等。可以是需要而附加使用。

列印顯示,此部份支援固定顯示以及自訂顯示的選項。也可將顯示的資訊藉由

選項直接存檔。可供使用的選擇性相當彈性。

由於 find 指令是組合式的運用,所以可以是簡單的找尋某種檔名組合,也可以因對檔案系統與

檔案有更深入的理解,而進入到管理層次的使用領域。後者即代表您已能掌握這個強大的工具。

簡言之,如果能理解事物根本,即可清澈渾濁表象。如果您看了以下的中文選項說明,還是昏倒..

醒來還是一陣咒罵@#%$%.....或許就是您該讓自己多理解一些檔案系統的時候了。

順便在此說明一點,由於 find 的指令是直接且即時地對檔案系統做遞迴搜尋,所以執行效率遠

不及具資料庫型態的搜尋工具。因此,如果僅是單純的以檔名找尋檔案所在,建議使用 locate 這

類的工具會更有效率一些。

指令說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 147

find

使用 find 指令,基本上必須給予兩個主要的組成,第一是指令的執行路徑,其二則是偵測與顯

示的選項,此部份即是前面所提到的搜尋的檔案條件、命令執行、列印顯示的組合。指令是由左

到右遞迴執行我們指定的參數與運算式,並按照"運算符號"的優先規則來進行。

第一個以符號 '-' 或 '(' 或 ')' 或 ',' 或 '!' 為開頭者,將被視為"運算式"的開始。在此之

前的引數被視執行路徑。而之後的部分則屬運算式部分。如果沒有給予執行路徑,會以當前目錄

作為預設值代入。如果沒有列印顯示,則以 -print 作為預設值。

當所有目錄內容都被成功處理完畢後,指令的執行狀態值為 0。如果發生錯誤則以大於 0 的狀態

值回應。

選項說明

除非使用的語法錯誤,否則,所有被執行的選項其狀態值都將為 "真" 值。為避免不必要的錯誤,

建議將她們放在運算式的開頭部分。

-daystart

起始時間以當日的 -amin, -atime, -cmin, -ctime, -mmin, 及 -mtime 為基準。

-depth

處理目錄內容之後,再處理目錄本身。

-follow

對符號連結的檔案或目錄不做檢查。隱含了 -noleaf 選項的作用。

-help, --help

顯示程式用法資訊。

-maxdepth levels

指定搜尋測試的最大目錄層數(levels)。對超過目錄層數的子目錄將不予以處理。

-mindepth levels

指定搜尋測試的最小目錄層數(levels)。對 levels 內的目錄層數將不予以處理。

-mount

只處理當前所在的檔案系統。不處理不同檔案系統(filesystems)的目錄。此選項在某些版本的

find 指令必須改用 -xdev 選項。

-noleaf

捨棄檢查目錄是否有兩個硬連結(hard link)的優化處理。(程式預設的優化處理,在不必要時,

反而會減緩搜尋測試的速度。如果使用者能理解自己檔案系統的硬連結狀況,適當地關閉預設的

優化處理,將有助於速度的提昇)

-version, --version

顯示程式本身的版本資訊。

-xdev

只處理當前所在的檔案系統。對放置在不同檔案系統(filesystems)的目錄不做處理。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 148

find

測試(Tests)

+n

比 n 大 (適用在以下,需代入 n 值的選項)

-n

比 n 小 (適用在以下,需代入 n 值的選項)

n

等於 n (適用在以下,需代入 n 值的選項)

-amin n

"最後存取時間"在 n 分鐘之前的檔案。

-anewer file

找尋檔案的" 最後存取時間"在指定 file 的 "最後修改時間" 之後。如果指令中同時有 -follow

選項,且放在 -anewer 選項之前。則 -anewer 會被 -follow 選項影響。

-atime n

"最後存取時間" 在 n*24 小時之前的檔案。

-cmin n

"最後改變時間" 在 n 分鐘之前的檔案。

-cnewer file

找尋檔案的" 最後改變時間"在指定 file 的 "最後修改時間" 之後。如果指令中同時有 -follow

選項,且放在 -cnewer 選項之前。則 -cnewer 會被 -follow 選項影響。

-ctime n

"最後改變時間"在 n*24 小時之前的檔案。

-empty

空的檔案文件或空的目錄。

-false

永為"偽"值。

-fstype type

放在 type 型態的檔案系統的檔案文件 (type 型態如 ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K

等等, 實際情況是你所使用的系統而定)。

-gid n

群組 ID 為 n 的檔案。

-group gname

群組屬性為 gname 的檔案 (接受數字的群組 ID)。

-ilname pattern

與 -lname 相似,但不區分大小寫。

-iname pattern

與 -name 相似,但不區分大小寫。

-inum n

節點(inode)數為 n 的檔案。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 149

find

-ipath pattern

與 -path 相似,但不區分大小寫。

-iregex pattern

與 -regex 相似,但不區分大小寫。

-links n

有 n 個連結的檔案。

-lname pattern

名稱與指定 pattern 相符的符號連結。對字元 '/' 與 '.' 不做處理。

-mmin n

"最後修改時間"在 n 分鐘之前的檔案。

-mtime n

"最後修改時間"在 n*24 小時之前的檔案。

-name pattern

名稱(移除路徑部分)與指定 pattern 相符的檔案文件。對字元 '*', '?', 及 '[]' 等不作處理,

忽略以 dot 開頭的特殊檔案,可使用 -prune 來忽略一個目錄下的所有檔案。

-newer file

找尋"最後修改時間"比指定 file 的"最後修改時間"還晚的檔案。如果指令中同時有 -follow 選

項,且放在 -newer 選項之前。則 -newer 會被 -follow 選項影響。

-nouser

不屬於任何使用者 ID 的孤兒檔案。

-nogroup

不屬於任何使用群組 ID 的檔案。

-path pattern

名稱與指定 pattern 相符的檔案文件。對字元 '/', '.' 不作處理。可使用 -prune 來忽略一

個目錄下的所有檔案。

-perm mode

找尋完全符合指定 mode 權限設定的檔案文件 (mode 可以使用符號或八進位數字)。

-perm -mode

找尋至少擁有指定 mode 權限設定的所有檔案文件。(這裡的權限設定指的是 讀(r), 寫(w), 執

行(x) 個別是否被設定,而非其代表她們的數字總和)

-perm +mode

找尋所有擁有指定 mode 權限設定的所有檔案文件。(只要符合一個個別的權限,就算符合)

-regex pattern

名稱與指定的正規表達式(regular expression) pattern 相符的檔案。此處檔案名稱是以完整

路徑來做比對。

-size n[bckw]

大小符合指定 n 單位的所有檔案。(單位的預設值為的 512-byte blocks,相當於 n 後加上 'b'

的使用,此外 'c' 代表 bytes,'k'代表 kilobytes,'w'代表 2-byte words) 在此 indirect

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 150

find

blocks 將不列入計算,但計算稀疏檔案的沒有實際配置的區塊。

-true

永為"真"值。

-type c

指定檔案的型態 c:

b

特殊區塊文件。(緩衝)

c

特殊字元文件。(非緩衝)

d

目錄

p

具名管道 (FIFO)

f

常規檔案

l

符號連結

s

socket

D

Door (Solaris 專有)

-uid n

使用者 ID 為 n 的檔案。

-used n

檔案的"最後存取時間"在"最後改變時間"的 n 天之後。

-user uname

屬 uname 使用者擁有的檔案 (接受數字的使用者 ID)。

-xtype c

與 -tyep 選項相同,但檔案必須為符號連結。當沒有使用 -follow 選項,而符號連結所指定的

目的檔為指定型態 c 時,回應"真"。如果使用 -follow 選項,如果型態 c 為 'l',回應"真"。

因此,-xtype 是用來檢測辣那些 -type 選項無法檢測的部分。

執行動作(Actions)

-exec command ;

執行指定 command ;若指令成功執行回傳 0 的狀態值。所有在 command 之後的 find 指令引

數,都會被當成是 command 的指令引數,直到 ';' 符號出現為止。在當中的 '{}' 字串將會以

正在處理的檔名所置換。有些版本的 find 則必須使用 '\' 來刮住,否則會被 shell 展開。

command 會在指令的起始目錄下執行。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 151

find

-fls file

當狀態為"真",類似 -ls 選項,但能將輸出寫入指定的 file。

-fprint file

當狀態為"真",在列印完整檔名到指令的 file 檔案中,如果 file 檔案不存在,則她將會被 find

指令在執行時自動產生。如果 file 檔案存在,則會被覆寫。

-fprint0 file

當狀態為"真",類似 -print0 選項,但將資料寫入 file 的動作則與 -fprint 相同。

-fprintf file format

當狀態為"真",類似 -printf 選項,但將資料寫入 file 的動作則與 -fprint 相同。

-ok command ;

與 -exec 相似,但會顯示詢問信息徵詢使用者;如果使用者不回應 'y' 或 'Y',command 將不

予以執行,並回應 false。

-print

當狀態為"真",在標準輸出列印完整檔名,然後加上一個換行符號。

-print0

當狀態為"真",在標準輸出列印完整檔名,然後加上一個 null 字元。

-printf format

當狀態為"真",在標準輸出列印指定 format,並解譯'\' escapes 字元 '%' 指令。欄位制定方

式與 C 函數的 printf 法則相通。此選項不像 -print, -printf 選項那樣會自動加上換行字元,

如果在格式上需要,必須自己在行末加上'\n'。

以下是所有可以使用的 escapes 字元以及指令:

\a

警告聲

\b

退格

\c

立即停止當前格式輸出,並刷新輸出顯示

\f

結束表格

\n

換行

\r

回車 (Carriage return)

\t

水平跳格

\v

垂直跳格

\\

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 152

find

顯示 \ 符號

\NNN

顯示 ASCII 字元 (NNN 為八進位數字)

除了上述的描述外,如果在符號 '\' 後使用其他字元,將被視為一般字元來加以顯示。

%%

輸出一個 '%' 符號。

%a

檔案的"最後存取時間",格式是 ctime 函數的回傳值。

%Ak

檔案的"最後存取時間",格式用 k 來指定,可以是 '@' 或 'strftime' 函數的指令格式。下列

為所有的 k 值,實際可用的 k 值支援必須視您系統而定。

@

UNIX 紀元秒,自西元 1970 年 1 月 1 日 00:00 GMT 起累計的秒數。

時間欄位

H

24 小時制 (00..23)

I

12 小時制 (01..12)

k

24 小時制 ( 0..23)

l

12 小時制 ( 1..12)

M

分鐘 (00..59)

p

AM 或 PM 顯示

r

12 小時制的時分秒顯示 (hh:mm:ss [AP]M)

S

秒 (00..61)

T

24 小時制的時分秒顯示 (hh:mm:ss)

X

本地時間顯示 (H:M:S)

Z

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 153

find

時區代碼顯示 (如 EDT)

日期欄位

a

本地星期幾的名稱縮寫 (Sun..Sat)

A

本地星期幾的全名稱顯示 (Sunday..Saturday)

b

本地月份的名稱縮寫 (Jan..Dec)

B

本地月份的全名稱顯示 (January..December)

c

本地的日期與時間 (Sat Nov 04 12:02:33 EST 1989)

d

月份的幾號日期顯示 (01..31)

D

日期 (mm/dd/yy)

h

與 b 參數相同

j

太陽日 (001..366)

m

月份 (01..12)

U

一年的第幾週,以星期日為一週的開始。 (00..53)

w

星期幾 (0..6)

W

一年的第幾週,以星期一為一週的開始。 (00..53)

x

本地日期 (mm/dd/yy)

y

公元年份的後兩碼數字顯示 (00..99)

Y

公元年份 (1970...)

%b

檔案區塊大小,以 512-byte 為區塊單位 (四捨五入)。

%c

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 154

find

檔案的"最後改變時間",格式是 ctime 函數的回傳值。

%Ck

檔案的"最後改變時間",格式用 k 來指定,和 %A 相同。

%d

檔案的目錄層次深度;0 表示該檔案是指令的引數。

%f

去除檔案的路徑,剩餘檔名部分。

%F

檔案所在的檔案系統類型;此參數值可供 -fstype 使用。

%g

檔案所屬的群組名稱,如該群組沒有名稱則以群組 ID 顯示。

%G

檔案所屬的群組 ID。

%h

檔案所在的路徑。(也就是 %f 去掉的部分)

%H

指令的引數。

%i

檔案的節點數 (inode number 為 16 進位數字)。

%k

檔案大小 (以 1K blocks 為單位, 四捨五入)。

%l

符號連結的目的檔 (不是符號連結的檔案以空白顯示)。

%m

檔案使用權限 (8 進位)。

%n

檔案的硬連結數目。

%p

檔案名稱。

%P

去除指令代入的搜尋路徑後的相對路徑檔名。

%s

檔案大小 (單位 bytes 單位)。

%t

檔案的"最後修改時間",格式為 ctime 函數的回傳值。

%Tk

檔案的"最後修改時間",格式用 k 來指定,和 %A 相同。

%u

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 155

find

檔案的使用者名稱,如沒有名稱則以使用者 ID 顯示。

%U

檔案的使用者 ID。

除了上面描述外,在符號'%'後其他字元,顯示時'%'將會被忽略,而僅顯示後面的字元。

-prune

假始沒有 -depth 選項,則不進入當前目錄。如果給的 -depth 參數得到"偽"值,沒有效果。

-ls

當狀態為"真",在標準輸出顯示相當於 'ls -dils' 的資料格式。原則上檔案以 1K blocks 為計

算單位。在有設定 POSIXLY_CORRECT 環境變數的情況下,將以 512-byte blocks 為計算單位。

運算符號(Operators)

以優先次序,由高至低排列:

( expr )

強制優先

! expr

當 expr 是"偽"值時,回傳"真"。

-not expr

與 ! expr 相同。

expr1 expr2

如果 expr1 為"偽"值,則不執行 expr2 。

expr1 -a expr2

與 expr1 expr2 相同。

expr1 -and expr2

與 expr1 expr2 相同。

expr1 -o expr2

如果 expr1 為"真"值,則不執行 expr2 。

expr1 -or expr2

與 expr1 -o expr2 相同。

expr1 , expr2

執行 expr1 和 expr2。但,僅列出 expr2 的值, expr1 的值將被忽略。

實例說明

find 這個強力工具在實際應用層面是相當廣泛多樣的。坦白說,很難用幾個固定模式的例子來完

整地介紹她。以下的範例與整理的方式,來自於農夫自身對她的運用與理解,僅能說,這樣的介

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 156

find

紹多少能讓初次接觸的人理解她一部份的應用,以下的實例,著重在語法的說明,所有的實例結

果顯示均一概省略。....未能詳盡處,歡迎您提供意見給我。

簡單且妙用

"找尋"檔案,是多數的使用者對 find 指令功能的印象。其實最簡單的 find 使用可以得到一個

ls 不容易做到的功能 -- 顯示當前目錄,包涵其下子目錄的所有檔案。如下

# find .

如果你在自己的 home 目錄下使用上例,你即可得到一份完整的 file list。沒有代入任何關於

顯示的選項時,GNU find 會以預設值 -print 代入。坦白說,最好想成加上 -print 或 -ls 的

習慣,否則跨不同的 UNIX 平台時,極可能變成"什麼也沒有"的窘境。

如果要存檔,加上 -fprintf 選項即可

# find . -fprint file_tree

如果您想多掌握關於 print 方面的使用,請回到"執行動作"自行閱讀相關的選項。

路徑與目錄層次

基本上,find 的搜尋目錄,可以一次指定很多個,而且目錄層次的深度也可以被設定。看下例

# find ~/fbin ~/fperl /usr/local/fbin -name "chmod-web" -print

有時候,檔案有可能放在幾個地方,指令支援你將這些 path 放在一起。儘量避免由根目錄(root)

找起,如果你清楚目標可能在哪裡的話。

再來看另一個例子

# find . -name 'index.*' -maxdepth 2 -print

上例的語法中用到了 -maxdepth 2,表示只處理往下兩層的子目錄,再下一層的子目錄,就不做

處理了。選項 -maxdepth, -mindepth 在需要時,不僅可以發揮指令操作的精確同時也能適度地

減少不必要的系統負擔。

關於檔案名稱

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 157

find

-name 該算是個常用選項,在其中支援"正則表達式"的使用。來看以下幾個例子

# find ~/sourcecode -name "*.[ch]" -ls

列出位於 ~/sourcecode 目錄之下的所有檔名符合 *.c 或 *.h 的檔案。

# find ~/sourcecode -name "[a-zA-Z]*.o" -ls

列出位於 ~/sourcecode 目錄之下的所有檔名以小寫或大寫英文字母為開頭;並以 .o 為結尾的

檔案。

關於檔案權限

檔案使用權現的 讀(r), 寫(w), 執行(x) 是 permission bits 的三個基本狀態。find 支援

-perm mode, -perm -mode, -perm +mode 三種條件的 permission bits 偵測。選項 -perm mode

是完全符合指定的 mode。而 -perm -mode 與 -perm +mode 這兩個選項,很容易被人誤解釋為權

限數值總合上的小於或大於。這點在觀念上必須先有正確的認知,以免出現非預期的結果。

關於檔案大小

# find /home -size +50000k -ls

列出位於 /home 目錄下,所有超過 50000k 的檔案。

# find /home -size +30000b -size -50000b -ls

列出位於 /home 目錄下,所有區塊超過 30000b,且小於 50000b 的檔案。

請注意一點,選項 -size 的區塊單位是以 512-byte blocks。而一般 ls 指令所顯示的區塊單位

則是以 1024-bytes 為預設值。其它的在語法上並沒有特殊之處。

運算式的使用

# find . -ctime -3 \( -name "*.html" -o -name "*.php" \) -ls

上例,括號中的條件會先做測試,所以先檢查檔案是否符合 *.html 或 *.php 的條件,如果符合,

則再檢查是否符合"最後改變時間"是否在三天前,如果符合將它顯示到標準輸出。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 158

find

運算式的使用,原則上,括號的部分會優先執行,這點會算數沒兩樣。除了上列相當於 or 邏輯

的 -o 選項外,還有 and 邏輯的 -a,以及符號 ! 的反邏輯。

匹配檔案的命令執行

find 支援 -exec 選項用來執行指定的"命令",以便找尋匹配的檔案後讓你決定如何處理它。這

是個相當好的功能。

# find / -name core -exec rm {} \;

指定執行的"命令",其實並不限定於系統指令,自己也可以配合需要撰寫 shell script 來執行。

自訂顯示格式 -- printf 選項的使用

對一個檔案的資訊顯示,我們可以藉由像 -printf 選項來自己制定與顯示需要的資訊欄位與格

式。這點彈性對撰寫 shell script 的需求可以說是相當重要的。但做法比較麻煩,所以在一般

交談模式下會顯得比較沒有必要。

# find . -name fp -printf "%h/%f %l\n"

./akbin/fp ../akperl/fp

./akperl/fp

#

自訂顯示這類的應用,原則上端看使用者自身對資料欄位的需求而定。資料欄位請參考選項說明。

時間標籤與檔案

當你想以檔案的 atime (最後存取時間)、ctime (最後改變時間)、mtime(最後修改時間)等時間

標籤來找尋或整頓自己的檔案時,最簡便的方法就是使用 find 來做。

一般而言,像長久時間沒有被讀取的閒置檔案,或該被修改而尚未修改的檔案,你均可藉由簡單

的 find 來掌握她們。讓我們來看下面這個例子

# find . -atime +30 -ls

上例是找尋"最後存取時間"在 30 天以上的檔案,像這類的檔案,在某種程度上意味著閒置無用..

如果考慮清除,也可以用 find 來做

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 159

find

# find . -atime +30 -exec rm -f {} \;

在上例,find 會將符合的檔案,代入 {} 符號,讓 rm -f 來刪除。'\' 與 ';' 符號的作用請參

考 -exec 選項說明。

原則上,類似上例且常用的情況還有如:找尋短期間,檔案內容確信自己沒有異動,但卻發生不

明修改的檔案(這多少可讓自己檢討,檔案權限是否設定恰當?或者系統已經有被入侵的嫌疑);

# find . -mtime -1 -ls

或某一時間範圍內被修改過的檔案

# find . -mtime +10 -mtime -20 -ls

......等等類似的用法,在原則上是大同小異的。在這方面有明確需求者,應對檔案的時間三態

與指令的相關選項做較深入的掌握,這會有助於使用的精確性。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 160

fold

fold

指令語法

fold [OPTION]... [FILE]...

指令說明

當我們想把某個檔案,重新整理行的寬度時,你就會發現 fold 是個非常簡單好用的指令。她的

作用就是將指定的檔案,重新以指定的行寬來排列,並將結果輸出到標準輸出。如果指令沒有指

定行寬,指令會以預設值 80 來處理資料。

選項說明

-b, --bytes

以 bytes 為單位。

-s, --spaces

在空格的位置做換行的處理,可避免單字被強迫截斷。

-w, --width=WIDTH

指定 WIDTH 為每行的寬度。(預設值為 80)

--help

顯示程式用法資訊。

--version

顯示程式本身的版本資訊。

實例說明

# wc -L fileA

80 fileA

# cat fileA

A1234567890123456789012345678901234567890123456789012345678901234567890123456789

B1234567890123456789012345678901234567890123456789012345678901234567890123456789

#

上面的指令顯示 fileA 是個每行寬度 80 個字元的檔案。以下,則是我想要將她處理成每行寬度

50 的指令範例

# fold -w 50 fileA

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 161

fold

A1234567890123456789012345678901234567890123456789

012345678901234567890123456789

B1234567890123456789012345678901234567890123456789

012345678901234567890123456789

#

由於 fold 指令只將處理的結果送到標準輸出,所以如果想將處理結果存檔,得自己使用"重導向

"或使用 tee 指令來做。如下

# fold -w 50 fileA > fileA_out

# fold -w 50 fileA | tee fileA_out

需要時,自已玩玩看。蠻好用的。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 162

free

free

指令語法

free [-b | -k | -m] [-o] [-s delay ] [-t] [-V]

指令說明

顯示系統的實體(physical)與虛擬(swap)記憶體的已使用及尚可用狀態,以及共享記憶體(shared

memory)與 kernel 所佔用的緩衝區(buffer)。

選項說明

-b

以 bytes 為顯示單位

-k

以 kilobytes 為顯示單位(其實這也是預設值)

-m

以 megabytes 為顯示單位

-t

增列一行記憶體總計

-o

不顯示緩衝區調節(buffer adjusted)資訊

-s

持續的間格顯示,時間單位 - "秒"。可用來觀察記憶體耗用的變化。

-V

顯示程式本身的版本資訊

實例說明

記憶體是電腦在運作時相當重要的資源。她被利用與分配的狀態,與電腦整體效率有著密不可分

的關係。所以,適度地了解您的記憶體狀態是有其必要的。

# free

total used free shared buffers cached

Mem: 481536 401504 80032 0 16068 230876

-/+ buffers/cache: 154560 326976

Swap: 979924 18232 961692

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 163

free

#

如果嫌這種數據不太人性,我們可以換個人性選項 -m

# free -m

total used free shared buffers cached

Mem: 470 392 77 0 15 225

-/+ buffers/cache: 151 319

Swap: 956 17 939

#

有時,使用會因執行某個程式,而需要連續監控記憶體的狀態。這時可以使用 -s 選項來做。如

# free -s 3

total used free shared buffers cached

Mem: 481536 403056 78480 0 16656 231300

-/+ buffers/cache: 155100 326436

Swap: 979924 18232 961692

total used free shared buffers cached

Mem: 481536 403056 78480 0 16688 231300

-/+ buffers/cache: 155068 326468

Swap: 979924 18232 961692

total used free shared buffers cached

Mem: 481536 403056 78480 0 16688 231300

-/+ buffers/cache: 155068 326468

Swap: 979924 18232 961692

total used free shared buffers cached

Mem: 481536 403056 78480 0 16696 231300

-/+ buffers/cache: 155060 326476

Swap: 979924 18232 961692

...... (使用 Ctrl+D 來停止顯示)

這篇就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 164

free

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 165

hash

hash

指令語法

bash

hash [-lr] [-p filename] [-dt] [name]

指令說明

hash table 是 shell 在解譯命令時,首先尋找的對象。當指令不存在 hash table,shell 才會

利用 path 設定的路徑去尋找命令,然後加以執行。同時也會將之放進 hash table。當下一次要

執行同名命令時,不用重新透過 path 找尋。shell 藉此提高命令的執行效率。

內建指令 hash 目前支援有限,可以用來看 hash table 的內容以及簡單的清除管理。對一般使

用者而言理解這個觀念即可。

選項說明

-l

顯示記憶的命令

-r

清除記憶的命令

-p filename

將 filename 加入 hash table。filename 需為完整路徑的命令。(這個選項 bash 2.0 仍未完整

支援)

-d name

清除 name 在 hash table 的紀錄。

-t name

顯示 name 的完整路徑。

實例說明

[root@www logs]# hash

hits command

18 /usr/bin/tail

1 /bin/rm

5 /bin/netstat

9 /usr/bin/vim

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 166

hash

0 /bin/ps

7 /bin/ls

1 /bin/sync

1 /usr/bin/free

[root@www logs]

這是一個 hash table 顯示的例子。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 167

hashstat

hashstat

指令語法

tcsh

haststat

指令說明

內建指令 hashstat 用於顯示 shell 的 internal hash table 的利用狀態。

相關指令

rehash, unhash

實例說明

[root@www logs]$ hashstat

2048 hash buckets of 32 bits each

[root@www logs]$

簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 168

head

head

指令語法

head [OPTION]... [FILE]...

指令說明

在螢幕上列出指定檔案的開頭內容。指令以顯示前 10 行為預設值,支援選項可變更輸出行數或

字元數。除指定檔案外亦可使用 - 符號接受標準輸入。

選項說明

-c, --bytes=N

指定輸出開頭的 "N" 個字元

-n, --lines=N

指定輸出開頭的 "N" 行

-q, --quiet, --silent

不輸出檔案名稱的訊息

-v, --verbose

顯示檔案名稱的訊息

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實際範例

當我想查看一些檔案內容的開頭部分時,我會想到使用這個指令。一個或多個檔案同時皆可使用。

# head -n 2 error_log referer_log

==> error_log <==

line 1 data

line 2 data

==> referer_log <==

line 1 data

line 2 data

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 169

head

#

對一個以上的檔案使用時,預設值會先顯示檔案的名稱。指令也支援隱藏的功能,使用 -n 選項

即可。

# head -q -n 2 error_log referer_log

line 1 data

line 2 data

line 1 data

line 2 data

#

在 UNIX or Linux 系統中,與 head 指令有相似功能的"巒生"指令叫 tail,用來顯示檔案結尾

的內容 ,這篇就簡單的寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 170

hostid

hostid

指令語法

hostid OPTION

指令說明

程式藉由 gethostid() 得到一組 16 進位代碼,一般稱為 hostid 識別碼。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實際範例

# hostid

1bac013d

上例的 id 是 info hostid 裡的例子,有空時看看自己的好了。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 171

hostname

hostname

指令名稱

hostname - 顯示或設定系統的主機名稱

domainname - 顯示或設定系統的 NIS/YP 名稱

dnsdomainname - 顯示系統的 DNS 名稱

nisdomainname - 顯示或設定系統的 NIS/YP 名稱

ypdomainname - 顯示或設定系統的 NIS/YP 名稱

nodename - 顯示或設定系統的 DECnet 節點名稱

指令語法

hostname [-v] [-a] [--alias] [-d] [--domain] [-f] [--fqdn] [-i] [--ip-address]

[--long] [-s] [--short] [-y] [--yp] [--nis] [-n] [--node]

hostname [-v] [-F filename] [--file filename] [hostname]

domainname [-v] [-F filename] [--file filename] [name]

nodename [-v] [-F filename] [--file filename] [name]

hostname [-v] [-h] [--help] [-V] [--version]

dnsdomainname [-v]

nisdomainname [-v]

ypdomainname [-v]

指令說明

hostname 的作用是來設定或顯示當前主機名稱、網域名稱或者是系統的節點名稱。網際網路均使

用這些名字來標識主機。而 NIS/YP 在內部區域中也有相同的識別作用。

GET NAME (顯示名稱)

當指令不使用任何引數,顯示當前的名稱:

hostname 藉由 gethostname(2) 函數得到主機名稱,並顯示在螢幕上。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 172

hostname

domainname, nisdomainname, ypdomainname 則是藉由 getdomainname(2) 函

數來得到需要的資料,這同時也被看作為系統的 YP/NIS 名稱。

nodename 由 getnodename(2) 函數取得系統的 DECnet 節點名稱。

dnsdomainname 顯示 FQDN(Fully Qualified Domain Name)的網域名稱。而系

統的完整的 FQDN 可使用 hostname --fqdn 查詢。

SET NAME (設定名稱)

如果待入一個引數或者帶入 --file 選項調,命令將會設定主機名稱、NIS/YP

名稱或者是節點名稱。

注意,只有 root 才可以修改這些名稱。

不可使用 dnsdomainname 命令(參看下面的 THE FQDN ) 來設定 FQDN 或者

DNS 名稱。

每次系統啟動時,主機名稱通常在 /etc/rc.d/rc.inet1 或 /etc/init.d/boot

(通常讀取文件的內容,其中包括了主機名稱。例如 /etc/hostname )中設定。

THE FQDN

不能使用該命令修改 FQDN(通過 hostname fqdn 返回) 或者 DNS 名稱(通過

nsdomainname 返回)。系統的 FQDN 是一個由 resolver(3) 返回的主機名。

從技術上說:FQDN 指的是使用 gethostbyname(2) 以返回 gethostname (2) 所

返回主機名的名字。DNS 名稱是第一個 dot 之後的部分。

因此她依賴於使用者修改方式的配置。通常我們可以直接修改 /etc/hosts 檔

案。(如果 hosts 文件在 DNS 或 NIS 之前解析)。

選項說明

-a, --alias

顯示主機的別名(如果有設定)。

-d, --domain

顯示 DNS 名稱。請勿使用 domainname 來獲得 DNS 名稱,因為這會顯示 NIS 名稱,而非 DNS 名

稱。在此建議使用 dnsdomainname。

-F, --file filename

從指定的 filename 中讀取主機名稱。(以一個‘#’開頭的行)可忽略。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 173

hostname

-f, --fqdn, --long

顯示 FQDN(Fully Qualified Domain Name)。一個 FQDN 包括一個短格式主機名稱和 DNS 名稱。

除非你正在使用 bind 或者 NIS 來作主機查詢。否則,你可以在 /etc/hosts 檔案中修改 FQDN

和 DNS 名稱(這屬於 FQDN 的一部分)。

-h, --help

顯示程式用法資訊。

-i, --ip-address

顯示 IP 位址。

-n, --node

顯示 DECnet 節點名稱。當 root 指定參數或使用 --file name,將會設定一個新的節點名稱。

-s, --short

顯示短格式主機名稱。省略顯示第一個 dot 後面部分。

-V, --version

顯示程式本身的版本資訊。

-v, --verbose

顯示指令執行過程。

-y, --yp, --nis

顯示 NIS 名稱。當 root 指定參數或使用 --file name,將會設定一個新的 NIS 名稱。

實際範例

因電腦環境資源所限,沒有完整的環境設定..暫時從缺。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 174

id

id

指令語法

id [OPTION]... [USERNAME]

指令說明

顯示使用者的真實(real UID)及有效(effective UID)代碼及群組代碼。當使用者 real UID 與

effective UID 相等時,只顯示 real UID。如未指定 USERNAME,則以目前使用者為顯示對象。

選項說明

-a :忽略版本的相容性(for compatibility with SVR4.)

-g, --group :只顯示群組代碼

-G, --groups :只顯示支援的群組代碼

-n, --name :顯示名稱代替預設的數字(需配合 -ugG 使用)

-r, --real :顯示真實的使用者代碼代替預設的有效使用者代碼(需配合 -ugG

使用)

-u, --user :只顯示使用者代碼

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實務說明

何謂 real ID, effective ID

在系統中有一部分程式,當你去執行他們時,你的 uid 與 gid 會暫時改變到該執行程式所設定

的 uid 與 gid。這種特定的程式稱為 "setuid" 程式。譬如 passwd 指令,就是一個常用的例子。

# ls -l /usr/bin/passwd

-r-s--x--x 1 root root 15104 3 月 14 2002 /usr/bin/passwd

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 175

id

在權限裡的 "s" 即表示 "setuid"。任何使用者以自己的身份(real ID)去啟動執行該程式,然後

程式將使用者轉換成程式擁有者的身份(effective ID)。這樣的做法,得以讓一般使用者,獲得

適當的權限,如對 /etc/passwd 這個只有 root 才有權限改寫的檔案,寫入想要改變的資料。

這即是 real ID 與 effective ID 的差異。而 id 指令支援顯示這兩者。

# id

uid=500(akira) gid=500(akira) groups=500(akira),501(ahisis),502(farmer)

通常在不指定選項的情況下執行 id 指令,會得到完整的訊息輸出。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 176

import

import

有時候,我會因為撰寫文字的需求,而擷取 X 視窗的整個或部份的程式畫面。目前,我多半是在

KDE 的環境下操作,所以我慣用這個指令來做這件事。

由於是手動的指令,使用時必須自己掌握擷取方式,範圍與存檔的格式。也因此這個指令的選項

相當可觀,在他的 On-Line manual 中顯示的只是一部分,詳細的功能說明紀錄在 imagemagick 的

man page 中。這是個相當壯觀的說明,我第一次看時因體力不支而昏倒在桌上....(其實是睡了)

所以,我其實不甚清楚這個指令的功能範圍。

但也總算沒有白睡,由於周公他老人家也在 51 之後改用 linux (NoHat 1.0),所以,他教了我

幾招,醒來後,稍加演練,我的抓抓手就達到"抓我想抓"的境界了。

以下農夫就以自己擷取的幾種方式來做說明。舉例的作法,原則上多半可以在自己加以組合,並

不限於下列的幾種模式。當然如果看倌們另有高招的話,請務必賜教。

自由範圍擷取

# import -dither aksc-00.png

在指令下達後,用滑鼠圈選想要的螢幕範圍後,即產生 aksc-00.png 圖檔。

指定範圍擷取

# import -window root -crop 640x480-0+0 aksc-00b.png

直接擷取螢幕的左上角原點 (0,0) 範圍 640x480 到檔案 aksc-00b.png。坦白說,我自己很少用

這種方式擷取,因為不好掌握。

單張擷取--整個畫面

# import -window root -quality 90 aksc-01.png

這道指令一下,電腦馬上聽令把整個畫面轉存成 aksc-01.png 圖檔。不過就是因為他會馬上做,

所以會連同下指令的視窗一同擷取。但我就是不想要他杵在那裡破壞畫面,怎麼辦?

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 177

import

很簡單,就是就是叫電腦也睡一下,

# sleep 10 ; import -windows root -quality 90 aksc-02.jpg

我讓指令(送八粒)先"睡"10 秒,我(只送七粒)則趕緊關掉不需要視窗,擺好最優美的 pose (其實

早就準備好了),10 秒一到,電腦嗶嗶兩聲,我的萬巒女豬腳畫面就存成 aksc-02.jpg 了。這即

是農夫我"睡悟"來的作法。當然,如果 10 秒不夠,你也可以多睡一會。

單張擷取--工作視窗畫面

有時,我只需要單獨的視窗軟體畫面。如果擷取整個畫面反而麻煩。面對這種情況,我就可以下

import 指令,然後在用滑鼠去點已經打開的視窗軟體,就可以了。

# import -frame -quality 90 aksc-03.gif

這種方式好用是好用,但有所限制 -- 無法擷取操作中軟體畫面。特別是工作選單,是我時常要

抓取的。如果這個指令省略了 -frame 的話,擷取到是點選的工作物件,而非整個軟體視窗。

連續擷取--自動 n 張畫面

# import -window root -snaps 5 -pause 10 aksc-04.png

這個作法會以間格 10 秒的時間自動連續擷取 5 次,產生 aksc-04.png0~4,五張圖檔。其中的

空檔, 就是我設定來擺 pose 用的。這方法可以讓我抓到操作軟體時的工作選單狀態。事實上,

如果找需單張的話,我使用前面的單張睡覺法已經足夠。

連續擷取--以滑鼠點選視窗

# import -frame -sanps 5 aksc-05.png

這種方式,可以讓我連續點選視窗,一個接著一個地擷取畫面。

以上的功能組組合,基本上已經能夠應付農夫自己的需求,所以我就不打算在對個指令做更深入

的功能組合探討。不過,我相信,這個工具可組合應付的情況,應該是遠勝過上述狀況的。

在如今這個電腦的視窗操作年代。農夫我會選用 import 這個手動指令來做這些操作,其實是對

KDE 這個視窗環境陌生的緣故。當我草記完這指令的功能,也用她做了好半天後,我才在做查看

Redhat errata 順便閒逛時,發現了 KDE 裡也支援一個擷取工具。這個工具在制式安裝的情況下,

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 178

import

並沒有安裝,需自己手動安裝。工具包的名稱是 ksnapshot,放在 disk2。在分類

Applications/Multimedia 當中。

至於在 Gnome 中也有一個工具叫 Screen shot,提供了相似功能。至於純種的 X11 則可使用 xwd

指令來做擷取。

當旅人不自覺地步上一條比較曲折的長路時,要到達目的地,就有可能加倍地

辛苦。然而,能聊以安慰與自娛的,或許是這一路的風景吧。

旅人的汗,山間的風......

前人的腳印,後人的路......

下雨了,天亮了.....

在這風景中,我走我停我看...那也將是幅風景

祂亦供你走你停你看

在我心中,在你心中,在風景中.....

抱歉,這段是農夫學走路的感想,哈...離題...回堤....

網路農夫 2002/06/09

選項說明

-crop <寬>x<高>{+-}<x 座標>{+-}<y 座標>{%}

簡單的說,就是指定一個面積,以及以何處為原點。理解後就很簡單了。真想用這個選項的話,

你得想像在你的桌面上有一張面額一千的鈔票,設對了,就會從螢幕跑出來....這樣我肯定任何

人都能做的又快又好(如果沒有出來,請就近,找銀行相關人員協助處理)

-dither

擷取滑鼠圈選的範圍

-frame

擷取範圍擴大到視窗外框

-snaps <張數>

連續擷取指定的張數

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 179

import

-quality <1/100>

數字是 1 到 100 壓縮的品質,想要影像品質最好用 100(檔案會最大),效果最差用 1(檔案

會最小)。這個選項只對 JPEG/MIFF/PNG 格式有效。

-pause <秒數>

通常與 -snaps 選項搭配使用

-window <id>

擷取 X window 畫面,其後的 id,如果帶入 root 則代表整個視窗畫面,當然也可以帶入其他已

知的 window id。

備註

本文使用環境是 RedHat 7.3。如無法使用 import 指令,請檢視是否已安裝

imagemagick 工具包。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 180

jobs

jobs

指令語法

bash

jobs [-lnprs] [ jobspec ... ]

jobs -x command [ args ... ]

tcsh

jobs [-l]

指令說明

內建指令 jobs 主要作用在於掌控背景工作佇列。bash 與 tcsh 各自的語法差異並不大。

選項說明

以下是屬於 bash 的幾個選項說明

-l

顯示背景工作 IDs 與訊息

-p

顯示背景工作程序的 PID。

-n

顯示上次通知用戶後,執行狀態有更動的背景工作狀態。

-r

顯示執行中的背景工作

-s

顯示暫停執行的背景工作

實例說明

bash

# jobs

[1]+ Stopped top -s

[2] Stopped netstat -ct

[3]- Stopped bak-web

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 181

jobs

農夫個人感覺,就用途上來說,其實 bash 的 jobs 選項用處並不大。一般沒有走火入魔的使用

者,還是直接使用 jobs 就行了。真較具有實際作用的應該是 -p 這個選項

# jobs -p

5102

5155

5455

#

她會依序顯示背景工作的 PID,儘管顯示上比不上 tcsh 來的完整。但甚少有支援。

tcsh

$ jobs

[1] - Suspended netstat -ct

[2] + Suspended (signal) top -s

$ jobs -l

[1] - 5792 Suspended netstat -ct

[2] + 5793 Suspended (signal) top -s

$

以上是 tcsh 的顯示狀態。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 182

join

join

使用語法

join [OPTION]... FILE1 FILE2

指令說明

如果有需要將兩個檔案有相同欄位的文字資料檔案連結在一起的話,join 是個蠻適用的指令。先

看個典型的例子

$ cat file1

a a1

c c1

b b1

$ cat file2

a a2

c c2

b b2

$ join file1 file2

a a1 a2

c c1 c2

b b1 b2

資料檔案 file1, file2 的第一個欄位相同,使用 join 指令可以很輕易將這兩個檔案連結起來,

並將結果輸出(standard out)。

如果其中的 FILE1 或 FILE2 如果以 "-" 符號代替,則該位置的內容將會從標準輸入讀取資料。

但 FILE1 與 FILE2 不可同時為 "-" 符號。

對應的預設值是以 FILE1 的第一欄為基準,與 FILE2 的第一欄先做對應。如果吻合,則該行就

會被接合在一起,輸出到標準輸出。如果不吻合則不做輸出然後繼續進行下一行比對。

檔案的欄位可以是 space、tab、或 new-line 等字元做為分隔。如果行的開頭有 tab 或 space,

做標準輸出時會被忽略。

選項說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 183

join

-a FILE-NUMBER 設定 FILE1 或 FILE2 作為顯示的基準,1 表示 FILE1, 2 表示 FILE2。

-e STRING 設定替換字串。用以替換空白的輸入欄位。

-i, --ignore-case 資料比對時,忽略大小寫。

-j FIELD 相當於 -1 FIELD -2 FIELD。

-j1 FIELD 相當於 -1 FIELD。

-j2 FIELD 相當於 -2 FIELD。

-o FORMAT 指定資料顯示格式,格式可以為 '0' 與單個或多個 n.m 的任意組合,第一

個數字 n 代表檔案,第二個數字 m 代表欄位, 而 '0' 代表對應欄位。

-t CHAR 指定欄位的分隔字元。

-v SIDE 與 -a 選項相似, 但是只顯示指定檔案中沒有相同欄位的行。

-1 FIELD 指定 FILE 1 的對應欄位

-2 FIELD 指定 FILE 2 的對應欄位

--help 顯示使用說明文字

--version 顯示自身程式版本

實務說明

先瞻仰一下作者

# join --version

join (coreutils) 4.5.3

由 Mike Haertel 編寫。

Copyright (C) 2002 Free Software Foundation, Inc.

這是自由軟體;請參考原始碼的版權聲明。本軟體不提供任何保證,甚至不會包括

可售性或適用於任何特定目的的保證

#

其實有時候,看看程式的版本,也會有意外的驚喜。

一般狀態與改變顯示基準

指令的預設值只顯示兩者比對後符合條件的資料。有時候,可能會需要的是某個檔案完整的資料

比對,這時候可以使用 -a 選項來設定需要的顯示狀態

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 184

join

# cat f-user

c0 akira

c1

c2 farmer

c3 Jones

c4 bill

# cat f-passwd

c1 kde93Bmi

c2 iei923j9

c3

c4 k4(i93#a

#

檔案 f-user 與 f-passwd 當中的第一欄位是比對基準,這也是 join 指令的預設值,所以,習

慣上農夫我以此慣例來做舉例。第二欄則是資料欄位。

當我需要使用者+密碼的資訊時,簡單地做 join 合併的動作即可

# join f-user f-passwd

c1 kde93Bmi

c2 farmer iei923j9

c3 Jones

c4 bill k4(i93#a

#

以上是使用 join 指令預設值的結果。比對的基準欄位是第一欄(兩個檔案相同)。只輸出吻合比

對的資料。所以你可以發現,f-user 檔案的第一行(c0 akira),由於 f-passwd 檔案沒有相對應

的行,所以沒有輸出該行。

如果想改變這種輸出的狀態,必須藉由 -a 選項來指定輸出基準。

# join -a 1 f-user f-passwd

c0 akira

c1 kde93Bmi

c2 farmer iei923j9

c3 Jones

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 185

join

c4 bill k4(i93#a

#

選項 "-a 1" 代表以第一個檔案為輸出基準,所以上述指令其輸出結果包含了 f-user 檔案的每

一行資料以及檔案 f-passwd 的相關欄位資料。

選項 "-a 1" 中間的空格其實可以省略。也就是說把他寫成 "-a1" 也同樣可正常工作。

調整輸出格式

在實際運用上,資料檔案的內容可能有兩個以上的資料欄位。而我們比對合併後的欄位輸出也相

對的,不僅僅只是順位式的固定輸出。為了容易明瞭,我想還是舉個比較單純的例子。讓我們來

將上一個範例的輸出結果以反順序輸出,也就是欄位 1, 2, 3 要改變成 3, 2, 1。

這種情況可以使用 -o 選項來製定自己想要的欄位格式,如下

# join -a1 -o 2.2 1.2 0 f-user f-passwd

akira c0

kde93Bmi c1

iei923j9 farmer c2

Jones c3

k4(i93#a bill c4

#

以上的實例均屬於簡易型態的需求與運用。在實際運用上,資料檔案的內容可能有兩個以上的資

料欄位。而我們比對合併後的欄位輸出也相對的,不僅僅只是順位式的固定輸出。基本上只要掌

握與運用比對欄位、檔案;分隔字元,以及輸出格式等功能選項,join 多半足以應付。農夫個人

認為,就功能性來說,算是個蠻簡單且好用的工具。

在系統中與 join 相似卻具有著不同處理能力的指令有 paste 指令,當單純的 join 無法滿足需

求時不訪順便看看 paste 的處理能力是否比較合適。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 186

kill

kill

指令語法

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...

kill -l [ signal ]

指令說明

kill 的作用在於提供使用者可以自行終止指定的程序(以及該程序所連帶的子程序)。

簡單地說,老大哥 root 可以任意終止所有使用者的程序,但一般使用者僅可以終止屬於自己的

程序。所以,如果你是一般使用者,不想被"謀殺",可以選擇"自殺"。(請注意:以上這段文字,

請勿在現實生活中執行!)

kill 會送出指定信號給指定的程序。當沒有指定特定信號時,指令會送出 TERM 信號來終止指定

程序。此外在必要情況下,使用 KILL(9) 會嚐試強迫終止指定程序。

因為,bash, tcsh 都擁有同名的內建指令。所以這些 shell 的使用者,想執行這個外部指令

kill,必須指明絕對路徑。否則 shell 的同名內建指令將會優先執行。

選項說明

pid...

對 kill 指定的 pid 可能為下列四種情況之一:

n

當 n 大於 0,信號發送給 pid 為 n 的程序。

0

發送信號給程序群組當前所屬的 pid。

-1

發送信號給所有 pid 大於 1 的程序。

-n

當 n 大於 1,訊號發送給程序群組為 n 的所有 pid。

commandname

發送信號給所有程序名稱與 commandname 相同的 pid。

-s signal

發送指定信號。signal 可以為信號名稱或訊號數值。

-l

顯示所有可使用的信號名稱。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 187

kill

-a

對當前的具相同 uid 身份的程序,不限制 commandname-to-pid。

-p

只顯示指定的程序標識 (pid),不對她發送任何信號。

實務說明

首先,重新提一點先前已經說明過的環境問題。bash, tcsh 擁有相同名稱的內建指令,所以在一

般狀態下,使用者下的 kill 是內建指令。以下我以 bash 的使用環境來做說明。

# kill -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD

18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN

22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

30) SIGPWR 31) SIGSYS 33) SIGRTMIN 34) SIGRTMIN+1

35) SIGRTMIN+2 36) SIGRTMIN+3 37) SIGRTMIN+4 38) SIGRTMIN+5

39) SIGRTMIN+6 40) SIGRTMIN+7 41) SIGRTMIN+8 42) SIGRTMIN+9

43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13

47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-14 50) SIGRTMAX-13

51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9

55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5

59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1

63) SIGRTMAX

#

以上執行的 kill 是 bash 的內建指令。以下讓我們找找還有沒有 kill 的外部指令,

# whereis kill

kill: /bin/kill /usr/bin/kill /usr/share/man/man1/kill.1.gz /usr/share/man/man2/kill.2.gz

# /bin/kill -l

HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT

STOP TSTP TTIN TTOU TRAP IOT BUS SYS STKFLT URG IO POLL CLD XCPU XFSZ

VTALRM PROF PWR WINCH UNUSED

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 188

kill

我們找到了 /bin/kill,以絕對路徑執行相同的選項後,可以發現顯示的結果有很大的差異。這

個正是目前您所看的 kill 指令。

基本上,shell 內建的 kill 指令,已足以應付使用者的操作需求。您是否需刻意使用這個 kill

外部指令,端看您自己的需要與對程序的理解習慣,這沒有一定的答案。我自己只在撰寫 script

或者是 cron job 時,為了避免不必要的麻煩,才會刻意使用 /bin/kill。

這篇暫且到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 189

last, lastb

last, lastb

指令語法

last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [ -t YYYYMMDDHHMMSS ] [name...] [tty...]

lastb [-R] [-num] [ -n num ] [ -f file ] [ -t YYYYMMDDHHMMSS ] [-adiox] [name...] [tty...]

指令說明

簡單地說,last 指令的作用,在提供系統使用者目前及近日的登錄狀態資訊。而 lastb 的作用

則是提供使用者登錄失敗的紀錄。

last 的資料紀錄來自於 /var/log/wtmp 檔案,lastb 則來自 /var/log/btmp。

選項說明

-num

顯示列數,相當於最後的 num 比資料。

-n num

同上

-t YYYYMMDDHHMMSS

特定時間指定的資料狀態。

-R

不顯示 hostname 主機名稱或 IP 位址欄位。

-a

最後一欄,顯示從何處登錄的 hostname 名稱。

-d

以 hostname 主機名稱來取代 IP 位址顯示。

-i

與 -d 選項相似,但以 IP 位址顯示為主。

-x

顯示系統開、關機與執行等級等相關資訊。

實例說明

以下的舉例,我將省略所有輸出的資訊,有必要的話,看倌們可以在自已的系統上操作

# last -n 10

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 190

last, lastb

# last -t 20031209000000

# last -x

暫時簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 191

let

let

指令語法

bash

let arg [arg ...]

指令說明

let 是 bash 內建的整數運算。arg 代表運算式。

當得到的值為 0,回應狀態值 1,其他數值,則回應狀態值 0。

實例說明

來個簡單的(請不要偷笑)

#!/bin/bash

let a=5+4 b=9-3

echo $a $b

再來一個

#!/bin/bash

let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))"

echo "t1 = $t1, a = $a, b = $b"

好了,寫到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 192

link

link

指令語法

link FILE1 FILE2

link OPTION

指令說明

對指定的 FILE1 檔案,建立一個名為 FILE2 的連結檔案。

目前, link 指令只支援作檔案的實體連結(hard link)。目錄的連結,不可使用這個指令。算是

ln 指令的超精簡版。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

現在就讓我來為範例而...範例,先來看第一女主角...

# stat access_log

File: 'access_log'

Size: 47425101 Blocks: 92736 IO Block: 4096 Regular File

Device: 307h/775d Inode: 177388 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2003-11-20 17:21:05.000000000 +0800

Modify: 2003-11-20 17:21:24.000000000 +0800

Change: 2003-11-20 21:43:16.000000000 +0800

#

好,使用 link 建立第一女主角的分身...

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 193

link

# link access_log 20031120.log

沒有錯誤訊息,表示 OK 了.. 讓我們來看一下..

# stat 20031120.log

File: '20031120.log'

Size: 47425101 Blocks: 92736 IO Block: 4096 Regular File

Device: 307h/775d Inode: 177388 Links: 2

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2003-11-20 17:21:05.000000000 +0800

Modify: 2003-11-20 17:21:24.000000000 +0800

Change: 2003-11-20 21:51:46.000000000 +0800

#

資料顯示 Links 欄位為 2,Inode 的編號與 access_log 相同。連結成功。收工。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 194

ln

ln

指令語法

ln [OPTION]... TARGET [LINK_NAME]

ln [OPTION]... TARGET... DIRECTORY

ln [OPTION]... --target-directory=DIRECTORY TARGET...

連結的基本觀念說明

為何建立檔案連結

70 年代末至 80 年代初,這段時期的硬碟資源是相當相當昂貴。因此在多人多工的電腦環境中,"

資源共享"的觀念成就了 link 這項做法。

硬連結(hard link)

首次出現的檔案連結,在今日我們稱為 hard link。這種連結必須在同一個檔案系統下進行,允

許對"檔案"做連結,但"目錄"則不適用。檔案只佔用一個 inode,因此實際資料只有一份。任何

有權限設定連結的人,允許對這個檔案另外取新的檔名;但所有可以讀寫的人,存取的都是相同

的一份檔案。

這種連結的刪除跟一般檔案相同,由於多人多工的作業系統檔案有使用權限的觀念。所以一個使

用者如果胡亂開放檔案的使用權限,就有可能會發生,原檔的擁有者在刪除檔案後,其實檔案還

存在於系統的另一角落。這種連結檔案要真正消失,必須得等到 inode 真的被刪除才算數。也因

此,有時系統管理者在刪除使用者帳戶後,檔案系統裡仍舊遺留有該使用者 id 的孤兒檔案。

符號連結(symbolic link)或軟連結(soft link)

不能連結目錄與不同跨檔案系統的限制,稍後被克服了,這種連結被稱為符號連結(symbolic link)

或軟連結(soft link) 。每個連結的檔案或目錄,有自己的 inode,但沒有資料。只有原檔案才

是真正擁有資料的實體。也因此,當原檔案被原擁有者刪除後,其他僅只是連結的 inode,就無

法正確地找到資料了。

指令說明

基本上,ln 指令以硬連結為預設值;要做符號連結必須使用 -s 選項。

選項說明

--backup[=CONTROL]

對已存在的目的檔,建立備份檔。目前支援的 CONTROL 引數及作用如下

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 195

ln

• none, off, = 如目的檔名已存在,顯示警告訊息並退出程式

• numbered, t, = 自動產生 "檔名~n~" 的備份檔案,已存在的備份檔案會自動變更版本

名稱

• existing, nil, = 如已有 "檔名~n~" 備份檔,則產生新備份檔;如沒有,只覆寫已有

的備份檔。

• simple, never, = 建立簡單的備份檔(新檔覆寫舊檔)

-b

與 --backup 相似,但不支援引數。只建單一的備份檔案,因此(新產生的備份檔將會覆蓋已存在

的備份檔)。

-d, -F, --directory

建立目錄的硬連結(hard link),限管理者使用。

-f, --force

刪除已存在的目的檔,建立連結。

-n, --no-dereference

當目的檔為符號連結目錄時,將之視同一般檔案處理。

-i, --interactive

當目的檔已存在時,詢問是否覆蓋目的檔。

-s, --symbolic

建立符號連結(預設值為硬連結)。

-S, --suffix=SUFFIX

自訂備份檔的字尾符號(預設值是 ~ 符號)

--target-directory=DIRECTORY

指定特定的已存在的目錄,作為連結檔案的目的目錄

-v, --verbose

顯示指令的執行過程(先顯示連結訊息,再在作連結)

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

先確認程式版本

# ln --version

ln (coreutils) 4.5.3

由 Mike Parker and David MacKenzie 編寫

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 196

ln

Copyright (C) 2002 Free Software Foundation, Inc.

這是自由軟體﹔請參考原始碼的版權說明。本軟體不提供任何保證,甚至不會包括

可售性或適用於任何特定目的的保證

#

確認程式版本的動作,一般情況下,看起來或許會顯得多餘。但在學習或測試時,了解這項資訊

則是有其必要性的。

一般檔案的連結

一般檔案,只要使用者擁有"讀"的權限,原則上,就可以對她做檔案的連結。當然連結的目的目

錄得有寫的權限。譬如,兩個一般使用者之間的檔案分享,就屬於這種型態。當然牽涉到使用權

限,就會牽扯到管理,因此這也牽涉到系統管理者的管理理念與作業規範。以下我們將假定環境

是許可的。

在確定擁有讀取 /home/SourceCode/coreutils/coreutils-4.5.3.tar.bz2 這個檔案的權限下,

我使用 ln 指令將她連結到我自己的 home 底下。因為使用檔案連結,除了可以很方便地在自己

的目錄下讀取檔案外,同時又不會減少自己的 quota。這是一舉兩得的做法。

# ln /home/SourceCode/coreutils/coreutils-4.5.3.tar.bz2 .

#

指令並沒有出現錯誤訊息,表示連結成功。接著讓我們用 stat 指令來瞧瞧新建的連結檔案狀態

# stat ./coreutils-4.5.3.tar.bz2

File: './coreutils-4.5.3.tar.bz2'

Size: 3658901 Blocks: 7160 IO Block: 4096 Regular File

Device: 303h/771d Inode: 783392 Links: 2

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2003-11-15 14:26:46.000000000 +0800

Modify: 2002-11-29 04:46:11.000000000 +0800

Change: 2003-11-25 11:12:14.000000000 +0800

#

我們可以看到,檔案的類型是 Regular File(一般檔案)。Inode 為 783392,連結數 Links 值為

2,表示在檔案系統中有兩個檔名同時指向 Inode 783392,這也就是 hard link。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 197

ln

當然,在這種條件下,我們也可以做 symbolic link。但如果在環境許可做 hard link 的話,選

擇做 hard link 會比做 symbolic link 妥當一些。但如果檔案來源在不同的檔案系統,那就只

能選擇 symbolic link 來處理了。續看底下

檔案的符號連結

# ln /var/log/rpmpkgs rpinfo

ln:正在建立連結至'/var/log/rpmpkgs'的實際連結(hard link)'rpinfo':不適用的裝置間連結

#

哈!坦白說,農夫我是第一次,看到這種錯誤訊息(這種中文實在不好懂)。這是由於連結的來源

檔與目的檔分別處在不同的檔案系統(參考 df 指令),所以 ln 指令預設的 hard link,無法支

援所造成的。

除了檔案分散在不同檔案系統中,還有目錄,也是硬連結無法處理的。這兩種情況,我們就得選

擇比較帶風險的符號連結來處理。加上 -s 選項就可以了

# ln -s /var/log/rpmpkgs rpminfo

讓我們使用 ls 指令來看看剛完成的目的檔(rpminfo)與來源檔(/var/log/rpmpkgs)的 inode 與

其他訊息。

# ls -li /var/log/rpmpkgs rpminfo

32657 lrwxrwxrwx 1 farmer farmer 16 11 月 26 14:09 rpminfo ->

/var/log/rpmpkgs

130592 -rw-r--r-- 1 root root 23612 11 月 26 04:08 /var/log/rpmpkgs

#

訊息顯示她們各用擁有自己的 inode。使用符號連結的 rpminfo 只有 16 Bytes,也就是符號連

結只花你如此小的代價而已。以上符號連結的方式同樣設用於目錄。做法完全相同。

版本控制功能

目前的 RedHat 9.0 或 Fedora,甚至絕大多數的 linux 安裝套件,基礎指令的部分大都是採用

自由軟體基金會(Free Software Foundation, Inc.)的套件。ln 指令包含在 coreutils 當中。

目前的版本(coreutils-4.5.x)已支援版本控制。也就是選項 -b 與 --backup[=CONTROL]。這部

分農夫我打算以專文說明。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 198

ln

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 199

logname

logname

指令語法

logname [OPTION]

指令說明

顯示登入系統的帳戶名稱

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

這個我現在很常用,因為年紀大了。有時 su 到忘了我是誰,所有得用這個指令看看。

[akira@farmer akira]$ whoami

akira

[akira@farmer akira]$ logname

root

[akira@farmer akira]$

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 200

look

look

指令語法

look [-dfa ] [-t termchar ] string [file ]

指令說明

look 是個簡單好用的拼字查詢工具。指令預設了一份字典檔案(/usr/share/dict/words),做為

查詢的依據。如果覺得不夠用,也可以自設字典檔。

選項說明

-d

只比對英文字母與數字。

-f

忽略字母大小寫。

-a

使用候補字典 /usr/share/dict/web2。

-t

設定字尾字串。只有符合字首及字尾字串才顯示。

實例說明

/usr/share/dict/words (單字字典檔案)

/usr/share/dict/web2 (候補字典,RedHat 9.0 預設安裝,沒有此檔案。但 -a 選項仍舊會找尋

此檔。建議,自設的字典檔來替補此檔案。)

實例說明

# look director

director

directorate

directories

directors

directory

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 201

look

忘記如何拼字時,可以 look look。

選項 -t 理論上讓我們找尋字尾符合的單字,但我在 RedHat 9.0 下使用,似乎完全沒有作用???

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 202

ls

ls

指令語法

ls [OPTION]... [FILE]...

指令說明

這是個相當基礎常用的指令。嚴格說來,一般使用者與常用的操作,其實用不了以下這麼繁多的

選項。

以下這些選項說明,坦白說,寫的時候是看了就煩....唉!工程師的玩具。

就我個人經驗而言,在交談環境中比較常用的大體上有 -a, -F, -l, -s, -R 等選項。剩餘的選

項,大多屬於規範輸出格式,或者是自訂排序方式,與比較特殊的顯示格式制定的功能。這些選

項並非沒有用處,因為這些特定的格式調整,有時對撰寫 script 需求有很大的幫助(如果剛好需

要時,你肯定會因有這些特殊選項,感動的痛哭流涕)。

所以,想知道的..或現在剛好覺得無聊的話...多少看看吧。

選項說明

-a, --all

顯示所有檔案,包含特殊檔案(.file)

-A, --almost-all

顯示所有檔案,包含特殊檔案(.file),但隱藏 . .. 這兩個特殊檔案

--author

列出每個檔案的作者

-b, --escape

顯示跳脫字元(escapes)

--block-size=SIZE

自定 block size 的大小

-B, --ignore-backups

不顯示檔名結尾帶符號 "~" 的檔案或目錄(通常 vim 編輯時會自動產生的備用檔案就是會在原

檔名後附加上一個 ~ 符號)

-c

與 -l 選項搭配,會顯示檔案的最後更改時間(ctime),並以檔名排序。與 -lt 選項搭配時會顯

示 ctime 並以 ctime 排序。

-C

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 203

ls

多列(columns)顯示,由上而下、由左而右排列。

--color[=WHEN]

顏色顯示設定。參數值有 never(不使用顏色), always(使用顏色), auto(當終端機為標準輸出裝

置時,使用顏色)。

-d, --directory

僅顯示目錄本身,不顯示目錄下的其他內容。

-D, --dired

以 Emacs 的目錄模式作為顯示格式。

-f

資料以磁碟的存儲順序列出,不另外做排序。啟用 -aU 選項,並取消 -lst 選項的功能。

-F, --classify

檔名後附上代表檔案類型的特殊符號。 * 表示檔案可執行; / 表示目錄; @ 表示符號鏈結;| 表

示 FIFOs; = 表示套接字 (sockets);一般檔案沒有附加符號。

--format=WORD

設定顯示格式。格式(WORD)有 across, horizontal, commas, verbose, single-column,

vertical。功能上 across 等於 -x, commas 等效 -m, horizontal 等效 -x, long 等效 -l,

single-column 等效 -1, verbose 等效 -l, vertical 等效 -C。

--full-time

與 -l --time-style=full-iso 等效。顯示完整的時間。

-g

與 -l 選項相似,但不顯示擁有者欄位。

-G, --no-group

不顯示群組名稱,需搭配 -l 選項使用。

-h, --human-readable

檔案大小以 k, M, G 顯示。選項須與 -l 或 -o 選項合用。

--si

與 -h 選項相似,但計算單位是 1000bytes 而不是 1024 bytes。

--indicator-style=WORD

設定檔案類型標記,WORD 的預設值為 none,當設定為 classify 時,功能與 -F 選項相似。

-i, --inode

顯示檔案和目錄的 inode 索引數字。

-I, --ignore=PATTERN

不顯示符合指定的 PATTERN 檔案。

-k

等同 --block-size=1K 選項

-l

檔案資料以詳細格式顯示。欄位依序是 使用權限、硬連結數目、擁有者、群組名稱、大小、最後

修改時間、檔名

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 204

ls

-L, --dereference

顯示符號連結目錄的檔案內容。

-m

以逗號(,)作區隔字元。

-n, --numeric-uid-gid

相似 -l 選項,但顯示 UIDs 與 GIDs 數字

-N, --literal

顯示檔案和目錄名稱,包括控制字元。

-o

相似 -l 選項,但不顯示檔案的群組資訊。

-p, --file-type

檔名後附上代表檔案類型的特殊符號。與 -F 選項相似,差別在對可執行檔案不附加 * 符號。

-q, --hide-control-chars

顯示時使用問號(?)代替取代非圖形字元。

--show-control-chars

顯示非圖形字元。

-Q, --quote-name

將顯示的檔名用括號("")括起來。

--quoting-style=WORD

將符合指定 WORD 型態的檔名顯示時以括號括起來。WORD 有 literal, locale, shell,

shell-always, c, escape 等。

-r, --reverse

顯示檔名以降羃排序處理。

-R, --recursive

顯示"子目錄"的檔案資料。

-s, --size

顯示檔案所佔用的 blocks 大小

-S

以檔案的大小排序

--sort=WORD

設定排序型態。可指定的型態以及顯示的選項等效如後,extension -X, none -U, size -S, time

-t, version -v, status -c, time -t, atime -u, access -u, use -u

--time=WORD

自訂時間型態資料,取代預設的"最後修改時間"顯示。WORD 型態有 atime, access, use, ctime,

status

--time-style=STYLE

自訂顯示時間格式,STYLE 有 full-iso, long-iso, iso, locale, +FORMAT

-t

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 205

ls

以檔案的異動時間排序

-T COLS, --tabsize=COLS

設定跳格的寬度(預設值 8)

-u

與 -lt 選項搭配時,顯示"最後存取時間",並以她來排序;與 -l 選項搭配時,顯示"最後存取

時間",以檔名排序;其他使用,以"最後存取時間"排序

-U

不排序,顯示先後以目錄檔(.)紀錄的次序為依據

-v

以"版本"排序

-w COLS, --width=COLS

自訂螢幕顯示行的長度(COLS 預設值來自終端機的環境設定,其次則來自環境變數 COLUMNS,如

果沒有相關設定,預設值將為 80)

-x

資料顯示次序是,由行左至行右,再由上而下。

-X

以"副檔名"(extension)的字母次序排序。

-1

單列顯示

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

吼!光捲到這裡,都覺得辛苦!真不知道那個邊想邊打字的笨蛋到底在想什麼!

指令現存的選項裡,有一部分相似甚至是重疊的,其實交談環境下只要掌握自己想的知道的資訊,

認識該用的選項,大概就可以了。看倌們,就青菜蘿蔔,各取所好吧。

實際範例

注意環境的預設值

通常,ls 指令在一般的交談模式下使用次數相當頻繁。由於,每個人可能都會有自己慣用的選項

格式。因此,常態下的 ls 多半都有 alias 設定。

# alias ls

alias ls='ls --color=tty'

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 206

ls

上頭是農夫我目前使用的 RedHat 9.0 系統預設值。這個 alias 寫在

/etc/profile.d/colorls.sh 當中。如果使用 csh, tcsh 則設定在

/etc/profile.d/colorls.csh。

明瞭環境的狀態後,我們就可以選擇自己重新設定亦或是解除她。想重新制定可以選擇手動重設

alias 或者是將想設定的 alias 直接編輯在 .bashrc 起始檔案中。個人建議採用後者比較省

事。如果想解除原先的 alias,可以直接使用 unalias 來解除。

# unalias ls

幾個基本的顯示

關於隱藏檔(特殊檔案)的顯示:

在檔案系統中有不少隱藏的起始設定檔案或目錄,這些檔案是特殊檔案。要顯示這些檔案必須加

上 -a 選項。

# ls

akdoc-ls.txt konquerorLtWrPb

# ls -a

. .. akdoc-ls.txt .bash_history .bash_logout .bash_profile .bashrc .canna .emacs .gtkrc .kde

konquerorLtWrPb

#

不看不知道,突然看到包準嚇一跳。原來你額頭上有好多外星來的房客--毛囊蟎(Demodex

folliculorum)!

可以如何顯示檔案資訊:

一般使用者最常用選項 -l 來得到較多的檔案資訊。顯示的資訊格式如下

使用權限、硬連結數目、擁有者、群組名稱、大小、最後異動時間、檔名

# ls -l

總計 152

-rwxrwxrwx 1 root root 12819 11 月 6 11:05 akdoc-ls.txt

-rw------- 1 root root 133120 11 月 6 06:46 konquerorLtWrPb

lrwxrwxrwx 1 root root 8 11 月 8 12:44 log -> /var/log

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 207

ls

有時我們也可以自己組合幾個選項,來個特調。

# ls -asF

總計 196

4 ./ 4 .bash_logout 4 .emacs 0 log@

4 ../ 4 .bash_profile 4 .gtkrc

16 akdoc-ls.txt* 4 .bashrc 4 .kde/

4 .bash_history 8 .canna 136 konquerorLtWrPb

#

顯示所有檔案及其 Block size 與檔案類型資訊。這也是蠻受歡迎的選項組合。農夫個人覺得這

個組合充份地表現出東方人的美(心情好的解釋是:雖小但美。心情不好時:有啦,但小啦)。這

篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 208

lsattr

lsattr

指令語法

lsattr [ -RVadv ] [ files... ]

指令說明

顯示 ext2fs 檔案系統的專有屬性。

選項說明

-R

顯示目錄及其下所有檔案與子目錄內容的屬性。

-V

顯示程式版本。

-a

列出目錄中的所有檔案屬性,包含以 dot 開頭的特殊檔案。

-d

僅顯示當前目錄的屬性。

-v

顯示檔案的版本資訊。

實例說明

# lsattr -a /home/web

-------A----- /home/web/.

------------- /home/web/..

-------A----- /home/web/Fnuke-test1

-------A----- /home/web/Fnuke-test3

...下略

#

用 -a 顯示含特殊檔案的所有檔案屬性,用 -R 看目錄及其子目錄的所有檔案屬性,用 -d 光看

當前目錄屬性。指令的用法,原則上可以把她當成為 ls 看待...選項的使用也相差無幾。是個很

容易使用的指令

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 209

md5sum

md5sum

指令語法

md5sum [OPTION] [FILE]...

md5sum [OPTION] --check [FILE]

指令說明

md5 檢驗碼,是目前網路上廣泛採用來做為檔案安全檢驗的一種數值演算。

當我們到 GNU、Redhat、Fedora 等官方網站或相關的 Mirror 網站下載資料時,如何得知這份資

料沒被有心人變更過(尤其是非官方站點)?

如果你稍加留意,你會發現下載資料的相關說明中,會附上一組 md5 檢驗碼。當我們完成下載後,

這組 md5 檢驗碼能讓我們做基本且必要的安全驗證,清楚檔案是否為原始檔案。

ps:如果你是在 Mirror 站點下載資料,最好檢查一下,官方與 Mirror 站點的 md5 檢驗碼是否

相同。如果不同的話...最好還是到官方的站點,下載需要的資料,比較妥檔。

選項說明

-b, --binary

讀取二進位檔案(DOS/Windows 使用)

-c, --check

檢試檔案的 MD5 檢驗碼

-t, --text

讀取文字檔案(預設值)

--status

不做任何訊息輸出

-w, --warn

顯示檢視錯誤訊息

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

產生 md5 檢驗碼

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 210

md5sum

# md5sum fileA

6c71bd53e22b371e6fa6166b6e839519 fileA

#

上例是產生一個檔案的 md5 檢驗碼,相當簡單。當然將輸出到螢幕,只是看看而已,我們最好將

她建檔保留,如下

# md5sum fileA > fileA_sum

這樣做,我們便有了 fileA 的 md5 檢驗碼,日後我們可以用她來檢查,檔案是否被更動過。

用 md5 檢驗碼檢測檔案

# md5sum -c fileA_sum

# fileA: 正確

以上是大致的產生與檢測的方式。檔名的部分是允許使用萬用字元的。如 md5sum * > fileB 。

使用上也算有一點彈性。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 211

mesg

mesg

指令語法

mesg [y|n]

指令說明

基本上 mesg 控制著使用者的終端機是否使用 write 指令與接收訊息的狀態。一般的使用者,擁

有可自由設定,不過這項限定僅對自己與其他一般使用者有效。root 則不受此條件的限制。也就

是說 root 有特權,一般使用者一定得接收 root 所發送的訊息。

選項說明

y :允許執行 write 指令與接受其他使用者的訊息傳送

n :不允許執行 write 指令;也拒絕接收其他使用者所傳送的訊息

如果 mesg 沒有指定選項,則顯示目前設定的狀態。

實際範例

以下,是一般使用者的使用情況

# mesg

is n

# mesg y

# mesg

is y

# write Freeman

write: Freeman has messages disabled

當對方(Freeman)設定不接收訊息時,一般的使用者就無法傳送訊息給他。但他無法拒絕 root 送給他的訊

息。這篇,就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 212

mkdir

mkdir

使用者在系統中建立與管理自己的工作目錄,是非常基礎的操作,所以這是初學者該熟悉的基礎

指令。

建立新目錄的指令是 mkdir。刪除不需要的目錄則可視情況使用 rm -r 或 rmdir 指令。如果要

更改目錄的名稱,則可以使用 mv 指令。操作都不複雜。

功能選項

-m, --mode=xxx :建立特定權限的目錄。

-p :自動建立需要的上層目錄。

-v :顯示建立目錄的訊息。

實例

有天,我在電腦前面,想著該如何整理自己的電腦學習文件。我打算將所有文件放在一個叫 Docs

的目錄之下,然後以子目錄來整理文件的大類別,再視實際需要建立更細的分類。想法確定可行

後,我想開工的第一天先整理 Linux 的文件,存放文件的子目錄的名稱就叫 LinuxDocs 好了。

於是我開始建立我需要的目錄

[Di@www Di]# mkdir Docs

[Di@www Di]# mkdir Docs/LinuxDocs

先建 Docs 目錄,然後在接著建在其下的子目錄 LinuxDocs。這是相當平常的作法。但我想,在

看過 mkdir 支援的選項後,你應該會選擇使用更好的方法

[Di@www Di]# mkdir -p Docs/LinuxDocs

上面這一行指令的作用,相當於前面得三行指令的效果。;選項 -p 會自動建立 Docs 目錄,然後

建立 LinuxDocs 這個子目錄。如果不放心的話,我們可以在加上選項 -v ,顯示建立目錄的確切

訊息。

[Di@www Di]# mkdir -pv Docs/LinuxDocs

mkdir: created directory `Docs'

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 213

mkdir

mkdir: created directory `Docs/LinuxDocs'

就這樣,我邊想邊建了近一個鐘頭。其中有一些目錄,我想在建立的同時,使用選項 -m 來給予

目錄較特殊的使用權限。

[Di@www Di]# mkdir -m 700 -pv Docs/ego/diary

mkdir: created directory `Docs'

mkdir: created directory `Docs/ego'

mkdir: created directory `Docs/ego/diary'

[Di@www Di]# ls -l Docs/ego/

total 4

drwx------ 2 Di Di 4096 5 月 25 02:19 diary

這可讓我擺脫 umask 功能的限定,另外給予我要的設定值了。而不必另外再使用 chmod 來改變

使用權限。

我個人認為,一個使用者願意對指令選項的功能,多做了解,是相當正面的事情。這意味著,能

擁有更穩固的基礎與共多樣的能力。自然也能面對及應變更多樣的難題。要培養這樣的能力,只

需要自己多花一點時間去閱讀與理解。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 214

mv

mv

指令語法

mv [OPTION]... SOURCE DEST

mv [OPTION]... SOURCE... DIRECTORY

mv [OPTION]... --target-directory=DIRECTORY SOURCE...

指令說明

當使用者需要對檔案或目錄,做更改名稱,或做路徑搬移時,就用的上這個指令。

選項說明

--backup[=CONTROL]

對已存在的目的檔,建立備份檔。目前支援的 CONTROL 引數及作用如下

• none, off, = 如目的檔名已存在,顯示警告訊息並退出程式

• numbered, t, = 自動產生 "檔名~n~" 的備份檔案,已存在的備份檔案會自動變更版本

名稱

• existing, nil, = 如已有 "檔名~n~" 備份檔,則產生新備份檔;如沒有,只覆寫已有

的備份檔。

• simple, never, = 建立簡單的備份檔(新檔覆寫舊檔)

-b

與 --backup 相似,但不支援引數。只建單一的備份檔案,因此(新產生的備份檔將會覆蓋已存在

的備份檔)。

-f, --force

直接覆寫已存在的目的檔,不顯示覆寫詢問訊息。

-i, --interactive

在覆寫已存在目的檔之前,顯示覆寫詢問訊息。

--strip-trailing-slashes

刪除引數中所有來源檔案(目錄)末端的斜號。

-S, --suffix=SUFFIX

指定備份檔的後置字串

--target-directory=DIRECTORY

指定特定的已存在的目錄,作為更改檔案的目的目錄

-u, --update

當來源檔較目的地檔"新",或目的地檔不存在的情況下,才做移動。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 215

mv

-v, --verbose

顯示指令的執行過程(先顯示連結訊息,再在作連結)

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實際範例

檔案搬家

搬移檔案到另一個目錄,這是個基本動作。

# mv fileA ~/test/.

# mv fileB ../fileC

# mv /home/userA/file* .

以上的語法都是相當常用方式。搬移檔案,可以是單純的搬移;也可以是搬移

目錄兼更改檔名。

此外,當檔名中的來源檔使用萬用字元 * 的時候,目的檔則只能有兩種情況,

其一是使用 dot 符號來表示(原檔名),第二則是目的檔是個目錄。換話說,指

令 mv 無法使用萬用字元的方式來更改檔案名稱。

除了上述的情況之外,下列是個一次搬移目錄當下所有檔案的特殊做法

ls |xargs mv --target-directory=../d

檔名更改與一個限制

# mv fileB ../fileC

# mv fileA fileD

對 mv 指令來說更改檔案或目錄都是相同的做法。但目前指令 mv 仍無法使用萬用字元的方式來

更改檔案名稱。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 216

mv

覆寫保護

基本上,mv 指令通常會以 alias 來設定成 mv -i 是因為選項 -i 能警告你檔案覆蓋的問題。指

令的預設值是不會發出警告訊息的。這一點使用必須注意。

版本控制功能

目前的 RedHat 9.0 或 Fedora,甚至絕大多數的 linux 安裝套件,基礎指令的部分大都是採用

自由軟體基金會(Free Software Foundation, Inc.)的套件。ln 指令包含在 coreutils 當中。

目前的版本(coreutils-4.5.x)已支援版本控制。也就是選項 -b 與 --backup[=CONTROL]。這部

分農夫我打算以專文說明。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 217

nice

nice

指令語法

nice [OPTION] [COMMAND [ARG]...]

指令說明

nice 指令能讓使用者在執行程序時,指定一個優先等級,你可稱之為 nice 值。這個數值從最高

最快的 -20 到最低最慢的 19。負數值只有 root 才有權利使用。一般使用者,也可使用 nice 指

令來做執行程序的優先管理,但只能往慢的正值調整。所以,不會吵鬧的孩子叫"乖",也就 nice

啦。

nice 指令沒加上 command 引數,會顯示目前的執行等級。如果有 command 引數,但沒有指定

nice 值,會以預設值 10 作為 nice 值。

這個指令,在 tcsh 中有同名的內建指令,bash 則沒有。

選項說明

-n, --adjustment=ADJUST

指定 nice 值。

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

一般使用者,如果有不算重要的程序需要執行,其實偶而自己 nice 一下,也很好玩...看

# nice -n 5 nice

5

#

以 nice 值 5 來執行 nice 指令。

如果是 root 將需要迫切完成的工作,以 nice 負值來執行,將會佔用相當大的系統資源。雖然

這跑起來會很爽...,但這世間往往是,累不會死人,爽才會死人。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 218

nice

nice 指令是下指令的時候使用,對於已經在執行的程序,則可藉由 renice 來事後加速。唉!記

憶裡那眾人皆睡,我獨醒的感覺,真有點對不起昨日那些聯電的呆子...審慎使用!審慎使用!

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 219

nl

nl

指令語法

nl [OPTION]... [FILE]...

指令說明

將指定檔案的內容附加上行數,顯示到標準輸出。當沒有指定檔名或使用 "-" 符號時,資料將由

標準輸入讀入。

如果你看完以下的選項說明,你將會同意,這是個功能相當不錯的指令。

選項說明

-b, --body-numbering=STYLE

自訂附加的行號樣式(STYLE)

-d, --section-delimiter=CC

使用 CC 字元分辨標頭、內容和註腳

-f, --footer-numbering=STYLE

自訂註腳附加的行號樣式(STYLE)

-h, --header-numbering=STYLE

自訂標頭附加的行號樣式(STYLE)

-i, --page-increment=NUMBER

自訂行的遞增數(NUMBER)

-l, --join-blank-lines=NUMBER

指定空白行的合併行數(NUMBER),將 n 行合併成一行。

-n, --number-format=FORMAT

指定附加行數的格式(FORMAT)

-p, --no-renumber

分頁後不重設行數

-s, --number-separator=STRING

插入指定的字串(STRING)分隔行號和內容

-v, --first-page=NUMBER

設定每頁第一行的行數(NUMBER)

-w, --number-width=NUMBER

自訂顯示行數的位元數(NUMBER)

--help

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 220

nl

顯示程式用法資訊

--version

顯示程式本身的版本資訊

指令預設的選項為 -v1 -i1 -l1 -sTAB -w6 -nrn -hn -bt -fn。CC 是兩個用來分辨每頁的標頭、

內容和註腳的字元;如果沒有指定第二個字元則表示是 :。請輸入 \\ 表示 \ 字元。

在選項說明中所提到的樣式(STYLE)可以是以下其中一個:

a 每一行都加上行號

t 只有非空白的行才加上行號

n 每一行都不加行號

pREGEXP 只有行內容符合正規表示式的才加上行號

在選項裡中的格式(FORMAT)可以是以下其中一個:

ln 向左對齊,前面不加零補位

rn 向右對齊,前面不加零補位

rz 向右對齊,前面加零補位

實例說明

在 cat 指令有個 -n 選項,能為輸出加上行數。但 nl 指令則提供了更多這方面的彈性。

加上行數

# cat -n fileA

# nl fileA

以上這兩種方式,都可以為檔案 fileA 的顯示,加上需要的行號。

但如果想要讓附加的行數,做左右對齊或者是補零的動作就得依賴 nl 指令來做了。

# nl -n rz fileA

000001 /home

000002 |-- SourceCode

000003 | |-- MySQL

000004 | | |-- filter-requires-mysql.sh

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 221

nl

000005 | | |-- my.cnf

.....略

變更行數的遞增值、顯示位元數

預設的行數遞增值是 1,但這可以改變。選項 -i 可以讓我們做到這一點

# nl -i 2 fileA

1 /home

3 |-- SourceCode

5 | |-- MySQL

7 | | |-- filter-requires-mysql.sh

9 | | |-- my.cnf

.....略

#

除了遞增值以外,還有設定顯示行數的位元數。也就是 -w 選項,程式的預設值為 6。如果有必要

的話,我們可以自行更改

# nl -n rz -w 3 bb

001 /home

002 |-- SourceCode

003 | |-- MySQL

004 | | |-- filter-requires-mysql.sh

005 | | |-- my.cnf

.....略

#

這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 222

nohup

nohup

指令語法

nohup COMMAND [ARG]...

nohup OPTION

指令說明

對在習慣在主機 console 上工作的使用者來說,這個指令可能會比較陌生。使用這個指令通常會

是使用終端機從遠端登錄的使用者。或者是有習慣使用 Job control 的使用者。

在正常情況下, Shell 在系統中所執行的處理程序(process)會隨著 logout 而終止。因為系

統會隨著使用者的 logout 送出 hangup 的訊號將你所有的 process 終止。

因此,為了確保尚在執行的處理程序的繼續執行,就得使用 honup 來取消系統送出 hangup 訊號。

倘若使用者使用 nohup 執行一個背景工作,然登出系統。這時,程序所產生標準輸出會由 nohup

來代為處理。訊息會存放在使用者的 $HOME,檔名為 nohup.out。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

# nohup webbackup.sh &

上例是使用 nohup 指令將 shell script webbackup.sh 送入背景工作。原則上,nohup 不具背景

工作的能力,所以指令語法上一定得注意,加上 & 符號。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 223

paste

paste

指令語法

paste [OPTION]... [FILE]...

指令說明

如果有兩個以上的文字檔案要做內容合併的話,paste 指令提供了兩種簡單的"合併"型態。

預設的檔案合併功能是以檔案的"行"為單位進行合併,檔案與檔案間的資料會加上一個 TAB 來作

為區隔。一行處理完,在接著處理下一行,直到其中最長的檔案的最後一行為止。其中預設的區

隔符號(TAB),支援選項讓使用者自己做必要的變更。

另一個型態,更簡單,和串魚丸沒兩樣,只不過是檔案罷了。

選項說明

-d, --delimiters=LIST

自訂區隔字元(預設值 TAB)

-s, --serial

串連檔案

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實際範例

以下,我用兩個檔案,來做範例。實際上,paste 可以同時處理兩個以上的檔

案。

# cat -n aaa

1 title File_aaa

2 root akira

# cat -n bbb

1 title File_bbb

2 farmer huang

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 224

paste

可以從 cat 看到,每個檔案都只是簡單的兩行資料。接下來,用 paste 的預設功能來合併

# paste aaa bbb > ccc

# cat -n ccc

1 title File_aaa title File_bbb

2 root akira farmer huang

#

合併後的檔案,一樣也只有兩行。第一行,就是原 aaa 與 bbb 檔案的第一行合併的結果。第二

行與第一行做法相同。這就是 paste 設定的合併方式。

再來,我使用 -s 選項來做合併 aaa 與 bbb 檔案

# paste -s aaa bbb > ccc2

# cat -n ccc2

1 title File_aaa root akira

2 title File_bbb farmer huang

#

合併後的結果顯示,第一行相當於 aaa 檔案的內容,差異是原本兩行,被 paste 合併成一行。

第二行則是檔案 bbb 被處理後的結果,做法與第一行相同。

以上的處理方式即是 paste 能做的處理。如果這樣的合併處理,不是你要的,那這個指令就不適

用了。就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 225

popd

popd

指令語法

bash

popd [-n] [+n] [-n]

tcsh

popd [-p] [-l] [-n|-v] [+n]

指令說明

popd 指令的作用在刪除目錄堆疊的資料。當刪除一個堆疊中的目錄時,如果沒有特定選項,工作

目錄會自動 cd 到目錄堆疊最頂端的目錄去。

選項說明

bash

-n

只刪除堆疊中的目錄,不進行 cd 動作。

+n

刪除從左到右的第 n 個目錄。數字從 0 開始。

-n

刪除從右到左的第 n 個目錄。數字從 0 開始。

tcsh

-p

顯示目錄堆疊。(指令的預設值)。

-l

顯示完整路徑。(預設值會將使用者個人的 home 目錄以 ~ 符號表示)。

-n

當顯示路徑超過螢幕寬度時,會自動換行以保持目錄的完整。

-v

每行一個目錄的顯示目錄堆疊的內容, 每個目錄前面加上它在目錄堆疊中的編號。

相關指令

dirs, pushd

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 226

popd

實例說明

bash

[root@www etc]# dirs

/etc /home /etc/httpd/logs

[root@www etc]# popd

/home /etc/httpd/logs

[root@www home]#

當目錄堆疊有資料時,如果我們想刪除最頂端目錄,可以直接鍵入 popd,如此堆疊最頂端目錄便

會被刪除,同時工作目錄會自動變更到刪除之後的堆疊最頂端目錄。

tcsh

[root@www MyWork-FarmerFdoc]$ dirs -l

/home/web/MyWork-FarmerFdoc /root /var/log /home /etc/httpd/logs

[root@www MyWork-FarmerFdoc]$ popd

~ /var/log /home /etc/httpd/logs

[root@www ~]$

作用相同。理解她本質的功能,其實已經足夠了。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 227

ps

ps

指令語法

ps [options]

指令說明

坦白說,我喜歡稱 ps 為工程師指令。從這個指令我深深地感受到這個指令所背負的是 UNIX 沉

重的過去,為了兼容多種所謂的標準(Unix98, BSD, GNU)讓一件原本就不易簡化的事情更形複雜。

過半百的選項...重複再重複的相似組合...作用相同的多餘選項...以自我為標準的典型思維。

以下列出的選項說明,已經過篩選與減量。詳細完整的訊息請參閱原線上說明。如果看倌們真的

有興趣的話,這個指令大概得花上您一個星期的生命去理解...

選項說明

簡便指定程序顯示

-A 顯示所有程序

-N 除了下指令終端機外的所有程序

-a 顯示所有終端機下的程序,除了 session leaders

-d 除了 session leaders 外的所有程序

-e 顯示所有程序

T 顯示終端機本身的所有程序

a 顯示終端機本身的所有程序,包涵其他使用者

g 顯示現行終端機下的所有程序,包含 group leaders

r 顯示現行終端機正在執行的程序

x 顯示所有程序,不以終端機來區分

--deselect 反向選擇顯示

細項指定程序顯示

-C 顯示指令名稱

-G 顯示指定的群組(RGID)程序 (支援使用群組名稱)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 228

ps

-U 顯示指定的群組(RGID)程序 (支援使用群組名稱)

-g 顯示 session leader 或群組名稱

-p 顯示指定的 PID

-s 指定 sessions 程序,顯示所有其下的程序

-t 顯示指定的 tty

-u 顯示指定用戶的程序(支援用戶名稱)

U 顯示指定用戶的所有程序(支援用戶名稱)

p 顯示指定的 PID

t 顯示指定的 tty

--Group 同 -G 選項

--User 同 -U 選項

--group 同 -G 選項

--pid 顯示指定的程序 ID

--sid 顯示指定的 session ID

--tty 顯示指定的 tty

--user 同 -U 選項

輸出格式控制

-c 顯示 CLS, PRI 欄位

-f does full listing

-j 工作控制格式顯示

-l 長格式顯示

-y 不顯示 flags 欄位,並以 rss 取代 addr 欄位

X 老 Linux i386 登錄格式顯示

j 工作控制格式顯示

l 長格式顯示

s 程序訊號格式顯示

u 使用者格式顯示

v 虛擬記憶體格式顯示

輸出格式變更

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 229

ps

-H 程序結構顯示

-m 顯示所有執行緒

-n set namelist file

-w 寬格式顯示

S 列出含已中斷執行的程序

c 顯示真正的指令名稱

e 顯示指令的執行環境

f 以 ASCII 字元表示程序的結構

h 不顯示訊息標題

m 顯示所有執行緒

n WCHAN 與 USER 欄位以數字輸出

w 寬格式顯示

--cols 設定螢幕寬度

--columns 設定螢幕寬度

--cumulative 同 S 選項

--forest 以 ASCII 字元表示程序的結構

--no-headers 與 h 選項相似

--lines 設定螢幕高度

--rows 設定螢幕高度

--width 設定螢幕寬度

指令資訊

-V 顯示程式本身的版本資訊

L 列出所有欄位及說明

V 顯示程式本身的版本資訊

--help 顯示程式用法資訊

--info 列出除錯訊息

--version 顯示程式本身的版本資訊

實例說明

所有欄位資訊

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 230

ps

如果真有心理解與建立 ps 所能顯示的程序資訊,我建議您先在自己的系統上,做以下的動作

# ps L

%cpu %CPU

%mem %MEM

alarm ALARM

args COMMAND

blocked BLOCKED

bsdstart START

bsdtime TIME

c C

caught CAUGHT

class CLS

cmd CMD

comm COMMAND

command COMMAND

cp CP

cpu CPU

cputime TIME

drs DRS

dsiz DSIZ

egid EGID

egroup EGROUP

eip EIP

esp ESP

etime ELAPSED

euid EUID

euser EUSER

f F

fgid FGID

fgroup FGROUP

flag F

flags F

fname COMMAND

fsgid FSGID

fsgroup FSGROUP

fsuid FSUID

fsuser FSUSER

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 231

ps

fuid FUID

fuser FUSER

gid GID

group GROUP

ignored IGNORED

intpri PRI

lim LIM

longtname TTY

lstart STARTED

m_drs DRS

m_size SIZE

m_trs TRS

maj_flt MAJFL

majflt MAJFLT

min_flt MINFL

minflt MINFLT

ni NI

nice NI

nwchan WCHAN

opri PRI

pagein PAGEIN

pcpu %CPU

pending PENDING

pgid PGID

pgrp PGRP

pid PID

pmem %MEM

policy POL

ppid PPID

pri PRI

priority PRI

rgid RGID

rgroup RGROUP

rss RSS

rssize RSS

rsz RSZ

rtprio RTPRIO

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 232

ps

ruid RUID

ruser RUSER

s S

sess SESS

session SESS

sgi_p P

sgi_rss RSS

sgid SGID

sgroup SGROUP

sid SID

sig PENDING

sig_block BLOCKED

sig_catch CATCHED

sig_ignore IGNORED

sig_pend SIGNAL

sigcatch CAUGHT

sigignore IGNORED

sigmask BLOCKED

size SZ

stackp STACKP

start STARTED

start_stack STACKP

start_time START

stat STAT

state S

stime STIME

suid SUID

suser SUSER

svgid SVGID

svgroup SVGROUP

svuid SVUID

svuser SVUSER

sz SZ

time TIME

timeout TMOUT

tmout TMOUT

tname TTY

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 233

ps

tpgid TPGID

trs TRS

trss TRSS

tsiz TSIZ

tt TT

tty TT

tty4 TTY

tty8 TTY

ucmd CMD

ucomm COMMAND

uid UID

uid_hack UID

uname USER

user USER

vsize VSZ

vsz VSZ

wchan WCHAN

#

如此驚人的欄位資訊量,對一般使用者,甚至是系統管理者而言,就實際的操作需要,或許僅需

理解與掌握其中的一部分就已經足夠。畢竟在運用上,懂得如何看,比僅知道技術細節還來的重

要。

建議的選項組合

以下的組合,是農夫個人常用的選項組合。有些顯示結果是經過裁減的,因為多數的輸出資料是

相當長了。建議看倌們自己執行。

組合 ps axu

# ps axu

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.0 1312 80 ? S Dec13 0:04 init

root 2 0.0 0.0 0 0 ? SW Dec13 0:00 [keventd]

root 3 0.0 0.0 0 0 ? SW Dec13 0:00 [kapmd]

....下略

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 234

ps

選項組合 axu,大體上可以讓我們得到系統內所有使用者正在執行的所有程序。通常使用 axu 目

的是觀察系統運作的狀態或觀察 daemon 啟用的狀態。

組合 ps ex -u user

# ps e -u root

PID TTY STAT TIME COMMAND

18510 ? S 0:00 xcin LANG=zh_TW.Big5 TERM=dumb SHELL=/bin/bash...(略)

18545 ? S 0:00 /usr/bin/ssh-agent /usr/share/apps/switchdesk/...(略)

....下略

這組合,是一般用來觀看某使用者的在系統中存在的所有程序,並顯示該執行指令的環境變數的

狀態。

指令組合 ps axu | grep pattern

當想要找尋某特定字串的時候,我習慣這樣做。這個做法各系統都可適用。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 235

pstree

pstree

指令語法

pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]

pstree -V

指令說明

一般來說,使用 ps 得到的執行程序資料是精確的,但資料量也相當龐大,這點對掌握系統程序

概況來說是不容易的。pstree 正好可以彌補這個缺憾。她能將當前的執行程序以樹狀結構顯示。

指令支援指定特定程序(pid)或使用者(user)作為顯示的起始。

選項說明

-a

顯示執行程序的指令列與參數。如果是被記憶體置換出的程序則加上括號。

-c

取消同名程序合併顯示

-G

使用 VT100 終端機的繪圖字元

-h

對輸出結果,突顯當正在執行的程序

-H pid

與 -h 選項相似,突顯指定的特別程序

-l

長格式顯示

-n

以 PID 排序

-p

顯示 PIDs

-u

顯示 uid 訊息

-U

使用 UTF-8 (Unicode) 繪圖字元

-V

顯示程式版本訊息

實例說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 236

pstree

來看個以 root 權限顯示的 pstree

# pstree

init-+-apmd

|-atd

|-bdflush

|-crond

|-gdm-binary---gdm-binary-+-X

| `-startkde-+-Xsession---xcin

| |-kwrapper

| `-ssh-agent

|-gpm

|-httpd---94*[httpd]

|-kalarmd

....下略

#

指令對程序名稱相同會自動合併,所有 "|-httpd---94*[httpd]" 既表示有 94 個 httpd 程序在

系統中。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 237

pushd

pushd

指令語法

bash

pushd [-n] [dir]

pushd [-n] [+n] [-n]

tcsh

pushd [-p] [-l] [-n|-v] [name|+n]

指令說明

pushd 指令的功能是將目錄加入目錄堆疊中。如果指令沒有指定目錄名稱,則會將當前的工作目

錄置入目錄堆疊的最頂端。置入目錄如果沒有指定堆疊的位置,也會置入目錄堆疊的最頂端,同

時工作目錄會自動 cd 到目錄堆疊最頂端的目錄去。

以上的使用法則在 bash 與 tcsh 中大致相同。

選項說明

bash

-n

只加入目錄到堆疊中,不進行 cd 動作。

+n

刪除從左到右的第 n 個目錄。數字從 0 開始。

-n

刪除從右到左的第 n 個目錄。數字從 0 開始。

tcsh

-p

置換目錄堆疊 0 與堆疊 1。

-l

顯示完整路徑。(預設值會將使用者個人的 home 目錄以 ~ 符號表示)。

-n

當顯示路徑超過螢幕寬度時,會自動換行以保持目錄的完整。

-v

每行一個目錄的顯示目錄堆疊的內容, 每個目錄前面加上它在目錄堆疊中的編號。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 238

pushd

相關指令

dirs, popd

實例說明

bash

將目錄放入堆疊

讓我們來放幾個目錄到堆疊中看看

[root@www logs]# dirs

/etc/httpd/logs

[root@www logs]# pushd /home/web

/home/web /etc/httpd/logs

[root@www web]# pushd /etc/httpd/conf

/etc/httpd/conf /home/web /etc/httpd/logs

[root@www conf]#

以上是一般常用的 pushd 做法,放入目錄後,工作目錄一並變更到該目錄。如果不想變更工作目

錄的話,可以加上 -n 選項,看下例

[root@www conf]# pushd -n /var/log

/etc/httpd/conf /var/log /home/web /etc/httpd/logs

[root@www conf]#

可以發現,新置入的 /var/log 被放在目錄堆疊 1 的位置,而堆疊 0 沒有變動,因此工作目錄

也保持在原來的位置。

善用目錄堆疊

先看下邊的例子

[root@www conf]# dirs

/etc/httpd/conf /var/log /home/web /etc/httpd/logs

[root@www conf]# pushd +2

/home/web /etc/httpd/logs /etc/httpd/conf /var/log

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 239

pushd

[root@www conf]#

每當我們使用 pushd +n 做置換目錄堆疊的動作時,目錄堆疊就好像一個"輪盤",我們愛將工作

目錄轉到哪裡就轉到哪裡。如果你能接受這個使用觀念的話,目錄堆疊會是一項非常好用的功能。

tcsh

[root@www ~]$ pushd /var/lib/mysql/

/var/lib/mysql ~

[root@www mysql]$ pushd /etc/httpd/logs

/etc/httpd/logs /var/lib/mysql ~

[root@www logs]$ pushd /home/SourceCode/

/home/SourceCode /etc/httpd/logs /var/lib/mysql ~

[root@www SourceCode]$ pushd /home/web/MyWork-FarmerFdoc

/home/web/MyWork-FarmerFdoc /home/SourceCode /etc/httpd/logs /var/lib/mysql ~

[root@www MyWork-FarmerFdoc]$

以上是 tcsh 下的 pushd,原則上與 bash 的做法相同。

高雄<->台北

有時候,當需要來回在兩個特定的工作目錄編輯時,我們也可以將目錄放入堆疊的 0 與 1 的位

置。然後使用 -p 選項,這可讓工作目錄來回在堆疊 0 與堆疊 1 相互轉換。

[root@www ~/akbin]$ pushd -p

/etc/rc1.d ~/akbin /home/SourceCode /home/web/MyWork-FarmerFdoc

[root@www rc1.d]$ pushd -p

~/akbin /etc/rc1.d /home/SourceCode /home/web/MyWork-FarmerFdoc

[root@www ~/akbin]$

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 240

pwd

pwd

指令語法

pwd [OPTION]

指令說明

顯示你當前所在的工作目錄。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

想知道你在哪裡嗎

# pwd

/earth/here/now

簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 241

read

read

指令語法

bash

read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]

指令說明

read 這個內建指令在交談模式下,極少用到,但在撰寫 shell script 時卻時常少不了她。當

shell scrip 需要與執行者進行"交談"並讀取執行者所鍵入的資料,read 就派上用場了。

指令負責讀取標準輸入的輸入。被讀取的第一個引數指定給第一個變數,第二個引數指定給第二

個變數,以下類推。如果對應也所剩餘,則剩餘的引數會全部給最後一個變數。如果對應有所不

足,沒有引數對應的變數其內容為空。

選項說明

-a aname

讀取標準輸入到指定的陣列變數(aname)。值由 0 開始計算。陣列變數在讀取資料前會自動清空

容。

-d delim

用 delim 指定第一個字元(所以需入一個字元即可),來做為結束輸入的字元。

-e

假使標準輸入來自終端機,使用 readline 讀取。

-n nchars

在讀取指定的字元數後,自動結束。

-p prompt

以標準錯誤顯示指定的提示。同時 newline 省略。

-r

關閉符號倒斜線的 escape 定義。

-s

沉默模式,從終端機讀取字元時不回應任何顯示。

-t timeout

設定輸入的時間限制,單位秒。當超過時限未輸入資料,read 將自動終結,執行狀態值為 1。

-u fd

從檔案描述 fd 讀取輸入。

實例說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 242

read

預設的引數與變數對應關係

# cat read00

#!/bin/bash

read -p "S/N: " sn1 sn2 sn3

echo "sn1 $sn1"

echo "sn2 $sn2"

echo "sn3 $sn3"

#

上例是個非常簡單的 script。指令 read 指定了 sn1 sn2 sn3 三個變數來接收標準輸入的引數。

以下是執行的情況

# read00

S/N: 00 11 22 33

sn1 00

sn2 11

sn3 22 33

## read00

S/N: 00 11

sn1 00

sn2 11

sn3

#

使用 echo 所輸出的,就是鍵入的引數與 sn1, sn2, sn3 變數的對應結果。這是 read 指令預設

的做法。

陣列變數的使用

# cat read-a

#!/bin/bash

read -p "S/N: " -a sn

echo "sn0 ${sn[0]}"

echo "sn1 ${sn[1]}"

echo "sn2 ${sn[2]}"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 243

read

#

read 指令支援 -a 選項用來宣告陣列變數。上例是,基本的使用與呼叫,以下是執行的情況。

# read-a

S/N: 11 22 33 44

sn0 11

sn1 22

sn2 33

#

設定輸入的時間限制

選項 -t 支援"限時"的功能,這對偷懶或做到一半喜歡亂跑的執行者來說,是個不錯的功能。在

下例中,我設定的 5秒的時間,一旦超過這個時間沒有輸入,script 會自動終止執行。

# cat read-t

#!/bin/bash

read -p "Any pattern keyin, 5 second, please. :: " -t 5 sn1

if [ "$?" = 1 ]

then

echo "TimeOut, Sorry."

exit 1

fi

echo -n "md5 id: "

echo "$sn1" | md5sum - | colrm 33

exit 0

#

來看看她逾時不候的情況及正常的執行狀態

# read-t

Any pattern keyin, 5 second, please. :: TimeOut, Sorry.

#

# read-t

Any pattern keyin 5 second please :: deke

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 244

read

md5 id: eb2dde2422a2044de4ab8348e147c6f5

#

自訂輸入終止字元

一般情況下,我們都是以 return 來終止資料的輸入。但,如果有一天,我們 return 字元也是

資料輸入的一部分時,怎麼辦?

選項 -d 可以幫我們解決這個問題。

# cat read-d

#!/bin/bash

echo "Keyin any number (Type . to end your input.)"

read -d . kk

echo "(end)"

echo $kk

#

上例,我指定符號 . 來做為輸入終止的符號。因此在輸入數字時,使用 return 就不會中斷我的

輸入了。這對某些輸入提供了相當的便利性。

# read-d

Keyin any number (Type . to end your input.)

838393

985939

399230

399590

939939.(end)

838393 985939 399230 399590 939939

#

限定輸入字元數

使用 -n 選項,可以讓我們控制輸入的字元數,當輸入到設定的字元數目時,read 會自動終結。

# cat read-n

#!/bin/bash

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 245

read

echo "Keyin your ID: "

read -n 9 eu

echo -e "\n\nyour ID: $eu"

#

在 script 撰寫中 read 算是一個相當常用的指令,以上的幾種型態的運用,算是 script 撰寫

的基礎。這篇暫時到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 246

readonly

readonly

指令語法

bash

readonly [-apf] [name ...]

指令說明

在撰寫 shell script 時,當有必要將某變數轉換成唯讀變數時,readonly 指令可以幫上忙。其

實函數也可以藉由 readonly 來宣告。

當指令沒有指定變數名稱與任何選項時,將顯示目前所有的唯讀變數。

選項說明

-a

陣列變數的宣告使用。

-p

顯示所有的唯讀變數。

-f

函數的宣告使用。

實例說明

指令可以顯示與宣告唯讀變數,先顯示看看

# readonly -p

declare -ir EUID="0"

declare -ir PPID="28649"

...下略

以下是在交談環境下的簡單宣告,其實在 script 中做法也差不多,

# KKK="home"

# readonly KKK

# readonly

declare -ir EUID="0"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 247

readonly

declare -r KKK="home"

declare -ir PPID="28649"

...下略

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 248

rehash

rehash

指令語法

tcsh

rehash

指令說明

指令的作用在於更新 shell 的 internal hash table 資料。

每當我們撰寫一份新的 shell script 時,如果沒有做更新 internal hash table 的動作,即可

能在執行這個新增的 shell script 時,產生 "Command not found."。此時,我們最好執行一下

rehash,將 shell 的 internal hash table 手動更新。即可解除這種問題。

相關指令

hashstat, unhash

實例說明

$ rehash

指令的下法很簡單,可是使用的時機卻很重要。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 249

repeat

repeat

指令語法

tcsh

repeat count command

指令說明

repeat 是個有趣的內建指令。她的作用是重複執行 n 次你所指定的指令。

當你真有需要重複執行某個指令很多次時,這個內建指令可好用的很。這種例子並非沒有,譬如

說執行多次才令人安心的指令 sync,便是使用 repeat 的最好時機。

實例說明

讓我偷懶一下,拿老例子來說明

% repeat 3 echo "C shell repeat command"

C shell repeat command

C shell repeat command

C shell repeat command

%

簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 250

return

return

指令語法

bash

return [n]

指令說明

這個 return 指令專用在函數的執行狀態值的回遞。當指令沒有指定 n 值,則回遞上行指令的狀

態值。如果使用在函數外使用,當以 source 來執行 script 或函數時,回遞 n 值定結束執行;

如果直接執行,會以結束執行並回遞 false 與錯誤訊息。

實例說明

# cat return01

#!/bin/bash

fcr ()

{

echo function frc

return 13

}

fcr

echo $?

# return01

function frc

13

#

以上是一個簡單的使用範例。回遞的 n 值範圍與 exit 指令相同均為 0 ~ 255。

通常在 shell script 中處理狀態值回遞的做法是,函數之內使用 return,函數外使用 exit。

因為 shell scrip 多半是直接以檔案來執行的。但如果是使用 source 來執行 shell scrip 或

宣告的函數,那 return 也可以在函數外使用。來看下面的例子

# cat return02

#!/bin/bash

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 251

return

fcr ()

{

echo function frc

return 13

}

fcr

echo $?

return 12

# source return02

function frc

13

# echo $?

12

#

雖然,這種使用是被允許的。但還是建議能避免就避免。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 252

rev

rev

指令語法

rev [ file ]

指令說明

如果有一天,你需要將文字檔的行文全反過來顯示的話。怎麼辦?如果你突然需要把一個單字反

過來寫,怎麼辦??不要緊,用 rev 可以幫你"造反"。

指令的作用就是將每行的文字,反順序顯示。如果有指定檔名,就將檔案每行的內文,反向顯示。

如果沒有指定檔案,則會將標準輸入的文字,反向顯示。

實際範例

讓我們來練習一下"造反",先隨便建一個文字檔

# ls -l > list.txt

# cat list.txt

總計 8

-rw-r--r-- 1 root root 0 8 月 14 11:57 list.txt

-rw-r--r-- 1 root root 983 8 月 14 11:52 rev.html

-rw-r--r-- 1 root root 350 8 月 14 11:40 rev.txt

#

開始"造反"

# rev list.txt

8 計總

txt.tsil 75:11 41 月 8 0 toor toor 1 --r--r-wr-

lmth.ver 25:11 41 月 8 389 toor toor 1 --r--r-wr-

txt.ver 04:11 41 月 8 053 toor toor 1 --r--r-wr-

#

如果下次,想整整新手的話,用 alias 把他的 ls 設定成 "ls | rev"....不久,你就可以聽到...

我的電腦"造反"了......這篇,就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 253

rev

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 254

rm

rm

指令語法

rm [OPTION]... FILE...

選項功能

-d, --directory

用 system call unlink(2) 來取代 rmdir(2),解除連結的目錄。

使用這個選項使用者對刪除目錄必須有適當的權限才可使用。由於用 unlink(2)來替代 rmdir

(2)移除目錄,所以即使目錄不是空的,也會被刪除,如果有 processes 正在使用目錄下的檔

案,會等到 processes 結束後在參除。這種做法有時會導致 filesystem unreferenced,所以最

好在作為刪除後,用 fsck 做一次 filesystem check。

不熟悉此現象的使用者,建議勿輕易嘗試。

-f, --force

刪除檔案不存在時,不出現沒錯誤訊息。也就是說,沒有,就算了。

-i, --interactive

在刪除前,顯示詢問刪除信息

-r, -R, -recursive

刪除目錄

-v, verbose

刪除資料前,顯示名稱

操作實例--前言

這是一個基礎指令,本篇也是為初入門的網友而寫,所以農夫我從基礎的環境說起。

這個常用的刪除指令,一般都會在 shell 的起始檔案中設定 alias。

# alias rm

alias rm='rm -i'

這即是一般的做法,將 rm 設定為 rm -i。所以在正常狀況下,鍵入的 rm 被 alias 轉換成 rm -i

來執行。這點是使用者在執行指令時必須清楚了(尤其是初入門的使用者,更應該清楚)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 255

rm

# rm aaa.png

rm: remove `aaa.png'? y

#

上例看似初始狀態的 rm 指令會出現詢問,完全是因為 alias 代入了 -i 選項的緣故,希望剛接

觸的使用者不要誤以為那就是 rm 指令本身的預設值。

農夫曾面對一些初學甚至是已使用一段時間的使用者,詢問有關 rm 的問題,有一部分的問題就

是對使用環境認知不足所造成的。所以,在此特加以說明。

我個人認為,一個有心入門的使用者,該從認識使用者介面 shell 開始。先掌握操作環境再花時

間去探究系統的指令與工具。當然這或許會是一條比較心苦的路,但走過的人,都可練出穩健的

腳力,他就是登高峰得本錢。

清除檔案

好了,現在我想刪除非常多的圖檔,但我也清楚 rm 指令有設定 rm -i 的別名(aliases),如果

我要一個個確認 Yes or No,恐怕,我得確認到天亮(其實天恐怕也快亮了)。如下

# rm -i *.png

rm: remove `ak001.png'? y

rm: remove `ak002.png'?

所以我很確認地不要 -i 選項,這時可使用倒斜線(\)來讓 aliases 功能暫時失效。rm 指令就能

回歸沒有選項的正常狀態。(以下所有的例子,都是在此條件下操作)

# \rm -v *.jpg *.gif *.png

removing `KDE-01.jpg'

removing `KDE-02.jpg'

removing `KDE-03.jpg'

(以下省略.....)

上例,我選擇加上 -v 選項來顯示 rm 清除了那一些檔案。這樣我清楚地看到 rm 所刪除的檔案

狀況。

當然,有時對清除的檔案沒有絕對的把握時,最好加上 -i 選項,這也就是為何一般狀況下,我

們要設定 rm 為 rm -i 的原因。請謹慎使用。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 256

rm

刪除檔案的特例

以 - 為檔名開頭的檔案,對 rm 指令可算是一個特例,因為它會造成正常語法的誤判,請看以下

的例子

# ls -al > -freak

# ls -l

total 4

-rw-r--r-- 1 ak47 ak47 72 6 月 16 03:51 -freak

# rm -freak

rm: 不適用的選項 -- e

請用`rm --help'來顯示本指令的用法

更詭異的是,即使用引號或雙引號來括住它,也無法刪除

# rm '-freak'

rm: 不適用的選項 -- e

請用`rm --help'來顯示本指令的用法

# rm "-freak"

rm: 不適用的選項 -- e

請用`rm --help'來顯示本指令的用法

不過,還是有兩種方法,可以將這種怪胎檔刪除。其一,標明"相對路徑",如下

# rm ./-freak

rm: remove `./-freak'? y

#

其二,在檔案前面加上 "--"

# rm -- -freak

rm: remove `-freak'? y

#

這兩種方式均可刪除這種檔名的檔案了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 257

rm

清除目錄

# ls -l

total 8

drwxr--r-- 3 ak47 ak47 4096 6 月 16 03:58 akman

drwxr--r-- 3 ak47 ak47 4096 6 月 16 03:58 man

# \rm -rv man

removing all entries of directory `man'

removing all entries of directory `man/man2'

removing the directory itself: `man/man2'

removing the directory itself: `man'

#

在上面的例子,可以清楚地看到,指令 rm 對刪除目錄的層數是沒有限制的。也就是說,在刪除

指定的目錄時,儘管它底下還有多少個檔案或多少層子目錄存在,都將一併刪除。這點特性,使

用者應該掌握。

解除連結目錄

# mkdir test

# ln -s test testlink

# ls -l

total 4

drwxr-xr-x 2 ak47 ak47 4096 6 月 16 04:06 test

lrwxrwxrwx 1 ak47 ak47 4 6 月 16 04:06 testlink -> test

為了舉例,我建立了兩個目錄,一個使用 mkdir 開的一般目錄 test,另一個則是使用 ln 開的

symbolic link 目錄 testlink。

接著我使用選項 -d 來刪除這兩個目錄。當然順便加上 -v 選項,顯示執行的狀況

# \rm -dv test testlink

removing `test'

rm: cannot unlink `test': 是個目錄

removing `testlink'

結果顯示,symbolic link 的目錄 testlink 順利刪除,但對一般目錄 test 沒效(換個角度想,

就是不會被誤宰)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 258

rm

天還真的快亮了,這段,我就寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 259

rmdir

rmdir

指令語法

rmdir [OPTION]... DIRECTORY..

指令說明

這是個專門用來刪除"空目錄"的指令。

選項說明

--ignore-fail-on-non-empty

忽略因"非空目錄"所成的失敗執行。(這輩子還沒看過這麼長的選項,今天算開了眼界)

-p, --parents

多層次的空目錄刪除。由指定目錄的最底層開始,逐層嘗試刪除空目錄,當碰到非空目錄時便停

止刪除的動作。

-v, --verbose

顯示指令刪除目錄的作業狀況

操作實例

# rmdir dir-01

rmdir: `dir-01': 目錄不是空的

#echo $?

1

我刻意用 rmdir 去刪除一個非空目錄,得到預料了錯誤,狀態值為 1(失敗)。

# rmdir --ignore-fail-on-non-empty dir-01

#echo $?

0

錯誤訊息沒有出現,指令的狀態值是 0(成功),果然錯誤被忽略了。這選項實在是受不了的長。

想必原作者一定是"一江春水想東流"....哈哈哈,回題。

其實,這個"--教人-受-不了-的-長",單獨使用的意義並不大,農夫認為它唯一作用大概就是用

來配合選項 -p ,應付某種狀況 -- 修正回傳值。讓我們看以下使用 -p 選項的三個例子。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 260

rmdir

# mkdir -p a/b/c

# rmdir -pv a/b/c

rmdir: removing directory, a/b/c

rmdir: removing directory, a/b

rmdir: removing directory, a

#

我簡單地新建立一個三層空目錄,然後簡單地把他們刪除。

# !mkdir

mkdir -p a/b/c

# ls > a/b/file01

# rmdir -pv a/b/c

rmdir: removing directory, a/b/c

rmdir: removing directory, a/b

rmdir: `a/b': 目錄不是空的

# echo $?

1

#

我再建立同樣的目錄。這次在第二層,目錄 b 裡放一個 file01,也就是說他不再是空目錄了。

然後我以同樣的方式刪除。顯示資料告訴我,目錄 c 已刪除。但目錄 b 不是空目錄,因此無法

刪除。rmdir 的執行狀態值是 1(失敗)。

好!問題來了。

rmdir -p a/b/c 刪除了最後一層目錄,但沒有完全刪除完所有目錄,所以指令的執行狀態是失敗

值(1)。這是正常狀態。但最後一層目錄確實已經刪除。如果這種狀態,我希望他回傳值是 0,可

能嗎?

答案是可以的,只要加上"--教人-受-不了-的-長"選項。請看下例

# mkdir a/b/c

# rmdir -pv --ignore-fail-on-non-empty a/b/c

rmdir: removing directory, a/b/c

rmdir: removing directory, a/b

# echo $?

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 261

rmdir

0

#

我再次建立同樣的目錄。但,這次我加上 --ignore-fail-on-non-empty 選項來刪除。我得到實

質相同的結果。不過,我得到代表執行成功的狀態值 0。

這就是它被創造出來的目的。乎!寫完了。真是"--教人-受-不了-的-長"......

ps,有個相關於這個選項的不可靠傳聞。聽說米蘭•昆德拉也使用 Linux。米老大也受不了這個

選項,他狂怒地罵它 - 選項中不能承受的長...之後,他因感而發,寫了一本小說 - 生命中不能

承受的輕。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 262

sleep

sleep

指令語法

sleep NUMBER[SUFFIX]...

sleep OPTION

指令說明

在只輸入數字的情況下,指令的預設時間單位是秒。

指令也支援時間單位的設定,s 代表秒, m 代表分鐘, h 代表小時, d 代表天。

數字不但可以是整數,偉大牛伯伯也讓這個睡覺指令接受浮點常數,所以也可以科學符號。

指令選項

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實務說明

# sleep 10m ; echo -e "10min.\a"

10min.

# sleep 2.5E+0s ; echo -e "2.5 sec\a"

2.5 sec

第一種是一般活老百姓的睡法,第二種是"科學小飛俠"的科學睡法。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 263

slocate

slocate

指令語法

slocate [-qi] [-d <path>] [--database=<path>] <search string>

slocate [-i] [-r <regexp>] [--regexp=<regexp>]

slocate [-qv] [-o <file>] [--output=<file>]

slocate [-e <dir1,dir2,...>] [-f <fstype1,...>] <[-l <level>] [-c] <[-U <path>] [-u]>

slocate [-Vh] [--version] [--help]

指令說明

slocate 是具安全觀念的檔案搜尋工具。locate 是這個指令的前身。由於她做搜尋時是針對自己

建立的 slocate 索引資料庫,所以找尋的速度比 find 要來的快許多。

檢索資料庫,通常由系統以設定 cron 的方式,每天做更新的動作。

選項說明

-u

建立以根目錄(/)為起點的 slocate 索引資料庫。

-U <dir>

建立以指定的 dir 為起點的 slocate 索引資料庫。

-e <dir1,dir2,...>

建立 slocate 索引資料庫時,排除指定的目錄。

-f <fstype1,...>

建立 slocate 索引資料庫時,排除指定的檔案系統型態。

-c

依 '/etc/updatedb.conf' 檔案的設定,更新索引資料庫。

-l <level>

安全等級,當 level = 0,表示取消安全模式。當 level = 1,表示啟動安全模式(預設值)。

-i

搜尋時,忽略字母大小寫。

-q

靜默模式。不顯示任何錯誤訊息。

-n <num>

指定 num 為顯示符合資料筆數的上限。

-r <regexp>, --regexp=<regexp>

以 POSIX 的常規法則(regular expression)做搜尋。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 264

slocate

-o <file>, --output=<file>

指定 file 作為產生索引資料庫的檔案名稱。

-d <path>, --database=<path>

指定 path 做搜尋。

-h, --help

顯示程式用法資訊

-v, --verbose

詳細顯示模式。建立資料庫時顯示檔案名稱。

-V, --version

顯示程式本身的版本資訊

實例說明

使用前的認知

slocate 指令是對自己的檔案索引資料庫做搜尋的,因此效率比 find 指令快很多;但,對新檔

案就可能發生找不到的現象。這點不須注意。以 RH9 為例,資料庫以 cron 每天更新,檔案在

/etc/cron.daily/slocate.cron,所以預設的 slocate 索引資料庫的更新週期就以"天"為單位

了。當然你可以是自己的需要做更動。

簡例

# slocate index.php

....輸出略

使用原則上很簡單,也支援常規法則(regular expression)做搜尋。其他的,自己看看"選項說明

"應該不成問題的。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 265

source

source

指令語法

bash

source filename [arguments]

tcsh

source [-h] name [args ...]

指令說明

source 指令會以目前的 shell 讀取指定檔案來解譯執行。常用以執行修改過後的啟始檔案,如

bash 的 .bashrc 或 tcsh 的 .tcshrc 等特殊檔案。

選項說明

tcsh

-h

將讀取檔案所執行的指令,列入過去指令使用記錄(history list)中,但並不執行所讀入的指

令。

實例說明

bash

通常,當我們修改像 .bashrc 或 .bash_profile 這類的啟始檔案後,必須使用 source 來重新

執行該檔案,新的修改設定才會產生作用

# source .bashrc

這個程序是使用者動手修改使用環境時,必須先認知的。否則可能就得 logout 又 login 了。

tcsh

基本上用法與 bash 一樣。只是多了一個有點奇怪的 -h 選項。這個選項有相當特殊的作用。一

般,source 讀取檔案執行時,執行內容不會列入 history list 當中。但如果你加上 -h 選項,

她們將會被列入 history list 當中。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 266

source

$ source .tcshrc

$ source -h .tcshrc

$ history

1 9:12 source .tcshrc

2 9:12 source -h .tcshrc

3 9:12 alias rm 'rm -i'

4 9:12 alias cp 'cp -i'

5 9:12 alias mv 'mv -i'

6 9:12 setenv PATH "/usr/local/sbin:/usr/sbin:/sbin:${PATH}:${HOME}/bin"

7 9:12 set prompt=\[`id -nu`@`hostname -s`\]\#\

8 9:12 history

$

上列,history list 中的 3 ~ 7 的指令,就是 -h 的傑作。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 267

split

split

指令語法

split [OPTION] [INPUT [PREFIX]]

指令說明

將指定的檔案分割成數個檔案,如果指令沒有使用任何選項時,預設的分割檔案長度為 1000 行。

分割的檔案會按指定的名稱或自動命名。

選項說明

-a, --suffix-length=N

設定分割檔案後,存檔檔名的字尾長度(預設值為 2)

-b, --bytes=SIZE

指定分割檔案的位元數(SIZE)

-C, --line-bytes=SIZE

與 -b 選項相似,但會自動保持行的完整性。

-l, --lines=NUMBER

指定分割行數

--verbose

顯示指令的執行過程

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

先拿個一般文字檔來割割看...

# split -a 3 -l 3000 access_log wlog-

#

哇@! 雖然割好了,但是忘了讓她見血,總覺得不過癮,再重割一遍

# split --verbose -a 3 -l 3000 access_log wlog-

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 268

split

正在建立檔案 'wlog-aaa'

正在建立檔案 'wlog-aab'

正在建立檔案 'wlog-aac'

#

賀! 過癮。本篇暫時寫到這裡....

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 269

stat

stat

指令語法

stat [OPTION] FILE...

指令說明

如果使用者想掌握檔案或檔案系統的參數資訊,那這是一個相當重要的指令。

指令顯示的資料格式大體上可分成三類,檔案資訊、檔案系統資訊以及自訂格式。前兩者是指令

的固定格式,原則上對一般使用者而言已經足夠。自訂格式的這部分,對撰寫 shell script 時

提供了相當大的使用彈性。

選項說明

-f, --filesystem

顯示檔案系統狀態(取代預設的個別檔案狀態)

-c, --format=FORMAT

自訂資料輸出格式

-L, --dereference

follow links 顯示連結目錄的檔案內容。

-t, --terse

精簡的訊息顯示

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

關於 -c 選項的所使用的代表符號,區分為"檔案"與"檔案系統"兩組,各自的符號定義略有差異,

使用上必須注意。目前的定義如下

檔案

%A - 檔案使用權限(格式: drwxr-xr-x)

%a - 檔案使用權限(格式: 755)

%b - 佔用的 blocks 數量

%D - 裝置號碼(16 進位)

%d - 裝置號碼(10 進位)

%F - 檔案類型

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 270

stat

%f - raw mode(16 進位)

%G - 群組名稱

%g - 群組 ID

%h - 硬連結(hard links)數量

%i - 使用的 Inode 數字

%N - Quoted File name with dereference if symbolic link

%n - 檔案名稱

%o - IO block 大小

%s - 總計(bytes)

%T - Minor device type(10 進位)

%t - Major device type(10 進位)

%U - 使用者名稱

%u - 使用者 ID

%X - 最後存取(last access)時間,顯示的是秒數(UNIX 紀元)註 1

%x - 最後存取時間

%Y - 最後修改(last modification)時間,顯示的是秒數(UNIX 紀元)

%y - 最後修改時間

%Z - 最後變更(last change)時間,顯示的是秒數(UNIX 紀元)

%z - 最後變更時間

檔案系統

%a - 一般使用者可使用的 blocks 數量

%b - blocks 總數

%c - inodes 總數

%d - 尚可使用的 inodes 數量

%f - 尚可使用的 blocks 數量

%i - 檔案系統 id (16 進位)

%l - Maximum length of filenames

%n - 檔案名稱

%s - Optimal transfer block size

%T - Type in human readable form

%t - Type(10 進位)

實例說明

常態的顯示與自訂顯示格式

當你有必要掌握關於某個檔案的更多資訊時,就可能會用上這個指令。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 271

stat

# stat access_log

File: 'access_log'

Size: 10646729 Blocks: 20832 IO Block: 4096 Regular File

Device: 302h/770d Inode: 1419844 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2003-11-14 14:13:30.000000000 +0800

Modify: 2003-11-14 14:28:07.000000000 +0800

Change: 2003-11-14 14:28:07.000000000 +0800

#

指令的對檔案顯示的預定格式,包含了檔名、檔案大小、佔用的 Blocks、IO Block、檔案類型、

Device, Inode、Link 數量、檔案的使用權限屬性、以及檔案的時間三態 -- Access time、Modify

time、Change time 等基本資訊。

如果想得到檔案所處的檔案系統資訊,可使用 -f 選項。

# stat -f access_log

File: "access_log"

ID: 0 Namelen: 255 Type: ext2/ext3

Blocks: Total: 5040301 Free: 2318687 Available: 2062652 Size: 4096

Inodes: Total: 2562240 Free: 2556350

#

對檔案系統的預定顯示有檔名, 檔案系統 Blocks 的總計、可用和已用狀態,Inodes 總數與剩餘

可用數量等基本資訊。

除了上述的資訊顯示外,指令也提供使用自訂顯示格式。使用選項 -c 來自訂顯示資訊。

# stat -c "%n %X %Y %Z" access_log

access_log 1069430178 1069430525 1069430525

自訂的格式,自己看的懂或知道如何用就可以了。這篇暫時到此。

相關與參考資訊

Encyclopedia: Unix epoch (http://www.nationmaster.com)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 272

stat

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 273

su

su

指令語法

su [OPTION]... [-] [USER [ARG]...]

指令說明

當使用者在登入系統後,想轉換成另一個使用者(帳戶)時,就是使用指令 su 的時機。常見的轉

換如一般使用者轉換成 root,或反過來 root 變換成一般使用者等等。

當指令沒有指定使用者名稱,帶入預設值 root。

選項說明

-, -l, --login

有如重新登入,會產生 login shell,使用環境將會重設成新使用者的環境變數。(如果指定的使

用者不存在,將自動帶入預設值 root) 轉換後的工作目錄也會改變到指定使用者的 home 目錄。

-c, --commmand=COMMAND

變更成指定的使用者後,以該使用者的身分,執行指定的指令。然後回復成原使用者身分。

-f, --fast

不讀取起始檔案(.cshrc),此選項只設用於 csh 與 tcsh

-m, --preserve-environment

不做環境變數的更換

-p

同 -m 選項

-s, --shell=SHELL

指定執行的 shell(可使用的 shell 為 /etc/shells 之下合法的 shell)

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

root 轉變成一般使用者

由於 root 對系統擁有絕對的管理權限,所以做 su 轉成時,不需要輸入密碼。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 274

su

# su - john

# pwd

/home/john

上例是由 root 身分轉換成一般使用者 john。成功轉換後,工作目錄變更到 john 的 home 目錄。

一般使用者轉換帳戶身分

如果原來的身分是一般使用者,不管 su 轉換的帳戶為何,都會詢問密碼。

# su -c /root/bin/w3bak root

上例,是 root 轉換成一般使用者 webadmin,並執行 /root/bin/w3bak 這支 shell script。這

篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 275

sum

sum

指令語法

sum [OPTION]... [FILE]...

指令說明

顯示指定檔案的總合檢查值(16-bit checksum)以及檔案的區塊(block)數目。當沒有指定檔案或

指定的檔名為"-"符號時,指令將改由標準輸入讀取資料。

選項說明

-r

使用 BSD 演算法 (block=1024 bytes)

-s, --sysv

使用 System V 演算法 (block=512 bytes)

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

簡單的檔案安全檢查法

我先簡單地將所有檔案的 checksum 值寫入 f1201 檔案中。

# sum -r * > f1201

但你會問,做這個幹嘛??????

通常執行 sum 指令,大都是為了確認檔案是否遭到不明人士的竄改這類安全理由而做。原則上,

檔案變動後 checksum 值就會不同。所以,如果我們能建一份檔案原始的 checksum 值,日後就

可做為檔案是否遭到修改的稽核參考。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 276

sync

sync

這是指令只做一件事,就是執行 system call sync(2),其作用是將緩衝於記憶體內的磁碟資料

寫入磁碟。

由於 UNIX/Linux 系統運作效率的考量,記憶體會暫存一些該寫入硬碟的資料。所以在正常的運

作下,系統運作會視需要將資料回寫入硬碟。也因此,有時,該寫入硬碟的資料,其實還在記憶

體中,等待回寫。也因此,UNIX/Linux 這類的系統是不能任意斷電關機的。正常的關機程序如

shutdown, reboot, halt 等指令都會呼叫特殊的 system call 來進行記憶體資料回寫的同步作

業。以確保資料的正確。這個 system call 就是 sync。

一般的使用狀況,在做過檔案系統的大規模變動,如解開一個很大的 tar file 或者是清除非常

多的資料,大規模地更改目錄或檔案的權限...可以的話,建議不彷手動做一下 sync。

# sync

需要時,記得用用。

加註:ext2 的檔案系統已經規範了 S(sync) 的檔案屬性,目前在 RedHat 7.3 中可以使用 chattr

修改。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 277

tac

tac

指令語法

tac [OPTION]... [FILE]...

指令說明

這是一個用途相當特殊指令,一般我們使用 cat 來顯示檔案內容時,會從檔案的第一行開始,然

後依序逐行,一直到最後一行為止。但 tac 指令的顯示順序剛好相反,她是從最後一行開始顯示。

當沒有指定檔名或使用 "-" 符號時,資料將由標準輸入讀入。

選項說明

-b, --before

將區隔字串放在檔案的開始部位。

-r, --regex

將區隔字元視為正規表示式。

-s, --separator=STRING

自訂 STRING 取代 newline 做為區隔字串。

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

# cat ulog

1128 2309482348 98393

1127 2932993993 89383

1126 2693990200 94030

# tac ulog

1126 2693990200 94030

1127 2932993993 89383

1128 2309482348 98393

#

對撰寫 shell script 的人,知道有這個指令就可以了。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 278

tac

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 279

tail

tail

指令語法

tail [OPTION]... [FILE]...

指令說明

在螢幕列出指定檔案的最後內容(預設值為 10 行)。支援選項可變更輸出行數或字元數。除指定

檔案外亦可使用 - 符號接受標準輸入。

選項說明

--retry :嘗試重新開啟檔案(需配合 -f 選項使用)

-c, --bytes=N :指定輸出檔案最後的 "N" 個字元

-f, --follow[={name|descriptor}] :持續顯示檔案更新的資訊

-F :等效於 --follow=name --retry 組合使用

-n, --lines=N :指定輸出檔案最後 "N" 行

--pid=PID :配合-f 選項使用, 設定 process ID 終結後,結束指令的執行

-q, --quiet, --silent :不輸出檔案名稱的訊息

-s, --sleep-interval=S :設定 -f 選項的間格時間(原預設值約一秒)

-v, --verbose :顯示檔案名稱的訊息

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實際範例

# tail access_log

顯示檔案 access_log 最後 10 行的內容。如果只需要顯示 2 行,可以使用 -n 選項來指定,如

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 280

tail

# tail -n 2 access_log

有時我會有種"監視"檔案異動的需求,譬如短暫性地監看 httpd 的 access_log 異動。我可以使

用 -f 選項來做

# tail -f access_log

這個做法也適用於一個以上的檔案監視。當我想終止異動顯示時,可用 Ctrl + c 來退出。這篇

就暫時寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 281

tar

tar

tar 原字義是指"深色的焦油",一般也稱為瀝青或柏油。tar 原作者 Chuck Haley 用這個字來代

表程式的功能,也就是將檔案粘在一起的意思。

在 Linux 中, tar 指令通常採用的是 GNU 撰寫的版本。使用的語法並必不特別但卻有一個特

色,她能以選項的方式直接呼叫壓縮解壓縮程式,如 gzip(-z) 以及 compress(-Z)。這點倒提供

了較合理的使用。因為原始的 tar 指令並沒有提供壓縮的功能。

如果列出 tar 全部的功能選項,是很壯觀的。因為 tar 是一個思考慎密的程式。對於檔案的製

作、比對、新增、特殊保留項目、檢查、展開等動作都有功能選項,同時還針對以上狀況的例外

做了特定額外的選項,所以第一次看她 on-line manual 的人,通常都會嚇一跳。其實在單機一

般狀況下用的選項只要幾個就足以應付了。

主選項

-A :將檔案合併(附加)到已經存在 tar 檔案中;append tar files to an

archive

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

-x :還原(展開) tar 檔案;extract files from an archive

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

-f :指定儲存的檔名或設備

輔配選項

-T, --files-from=F :進行轉檔的資訊由檔案取得(文字檔案)

--remove-files :打包後,刪除原檔案(小心使用)

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

--exclude FILE :打包時,排除指定的檔案

-X, --exclude-from FILE :讀取指定檔案(文字檔案),作為排除打包的檔案

表列依據。

-z :進行 gzip 壓縮(製作檔案時)或解壓縮(還原檔案時)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 282

tar

常規性實例

[Farmer_Akira@www]# 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 檔案的內容,通常我用這方式來查看一個檔案是否完整或者是任何錯誤訊

息在其中。

特例--子目錄的處理

這個特例,其實是回應一位網友問的問題。

如何 tar 一個目錄下的所有檔案,但不包含其子目錄?

這確實是個"好"問題。很久以前,我自己在 SUN 工作站上,也曾在備份資料時,

碰過相似的需求與想法(如子目錄的資料太多且太大或不需要備份想剔除),需

要在 tar 時刻意剔除。當時自己組合了幾個方法來解決這個問題。以下我將以

指令模式來作說明。當然,這個做法也很適合已帶入引數的方式來整合到 shell

script 中,提供網友作為參考。

正常狀況下,tar 對指定處理的目錄會連同子目錄一起處理。但有時,我就是不想把子目錄的資料

也 tar 下來。對這樣特地的需求,tar 目前尚無完全契合的選項可處理,所以我只好自己變通處理,

做法也是利用 tar 的 -T 選項,

# find . -type f -maxdepth 1 -print > layer01

# tat cvf bak01.tar -T layer01 ; \rm -r layer01

首先我使用 find 指令顯示所在目錄的所有檔案,用 -maxdepth 1 來剔除所有關於子目錄的資

料,然後將顯示的輸出導向存檔,名稱取作 layer01。這就是一個不含子目錄的所有檔案資料。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 283

tar

接著,我下 tar 指令,以 -T 選項讀取 layer01 檔案的內容,作為 tar 的對象,這樣我就得到

我想要的 tar file 了。最後則是順便把 layer01 檔案清除。

這個做法,可以延伸成為相當多的特定處理。只要你能產生怎樣特定的"檔案資料表",就能達到

怎樣的效能。當然,tar 指令本身也提供了一個反向的邏輯功能,那就是 -X 選項。此外,建議不

彷對 find 的功能多做了解。這對許多的指令的應用將有相當大的幫助。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 284

tee

tee

指令語法

tee [OPTION]... [FILE]...

指令說明

這個指令的名字取的很妙。"tee"在配線上的術語,指的是一種"T"字型的轉接頭。作用是讓訊號"

一頭進,兩頭出"。因此,你可以想像 tee 能做什麼,他就是用來將"標準輸入"的訊號,一頭導

向"存檔",另一頭導向"標準輸出"。換句話說,他可將標準輸入的訊息到複製到指定檔案,同時

亦將之重導到標準輸出。

但有一點請注意:tee 指令能處理存檔的訊息是"標準輸出",對於錯誤訊息,也就是"標準錯誤",

tee 指令是不做任何處理的。

選項說明

-a, --append :將內容串加到指定檔案 (不使用此選項的常態是覆寫檔案原來

的內容)

-i, --ignore-interrupts :忽略中斷信號

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實際範例

如果我想將 ls 指令的執行結果,顯示在螢幕上並同時存到一個檔案。這種場

合,平常閒的沒事幹的 tee 可有大用了。

# ls -a | tee list

.

..

mount.8

mount-8.html

tee.1

tee html

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 285

tee

# cat list

.

..

mount.8

mount-8.html

tee.1

tee.html

#

看,果然不錯用(為跟上時代的腳步,這裡使用了新新人類的新語法,果然不錯用)。

好用是好用,但有一點別忘了,他只對正常的訊息(標準輸出)有用,一遇到錯誤訊息,他就老人

家可理裡都不理一下,看....

# ls k* | tee list

ls: k*: 沒有此一檔案或目錄

# cat list

#

用 cat 看 list 的內容,先前的內容已被覆寫,目前的內容是"空無一物"。為什麼??? 原因無他,

因為訊息"ls: k*: 沒有此一檔案或目錄"是錯誤訊息的緣故。

如果不想覆寫,記得加上 -a 選項即可。如下

# ls k* | tee -a list

這篇,就簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 286

test

test

這裡介紹的 test 是 bash 的內建指令。她主要運用在"條件式運算"上。在 shell script 的判

斷式,時常借助於 test 來做判斷條件的偵測。執行指令的 exit status、變數數值、字串值、

檔案、目錄等均在她的偵測範圍內。因此越能掌握 test 的使用,對撰寫 script 的幫助就愈大。

由於 test 應用的時機相當多,性質也相當多變。以下我嘗試以 test 偵測對象與功能性來做區

分。並分成四個單元來做說明

• 對檔案的屬性偵測

• 對字串的偵測比較

• 對數字的偵測比較

• 邏輯符號的組合運用

對檔案的屬性偵測

[Farmer_Akira@www]# if test -r /etc/httpd/logs/access_log

> then

> echo Readable

> fi

Readable

[Farmer_Akira@www]#

在上例中,我使用 test -r 來判斷檔案 /etc/httpd/logs/access_log 是否可讀取,如果可讀取

則回應為"真",指令 echo 將會在螢幕上顯示 Readable。如果檔案不存在或檔案存在但不可讀取

則回應值為"偽"。然後,if 判斷式結束工作。

例子,再來一個。這次我偵測的對象是"目錄"

[Farmer_Akira@www]# if test -d /etc/httpd/logs/access_log

> then

> echo "Directory exist."

> fi

[Farmer_Akira@www]#

test 的回應是"偽",也就是告訴我偵測的對象不是目錄。if 判斷式直接結束。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 287

test

這種對系統檔案、目錄的偵測,使用 test 確實可以簡易地辦到。對這方面 test 支援了相當多

的選項。乍看是多的有點可怕,但用起來就像前面例子一樣簡單。所以,現在讓我們以一目十行,

過目即忘的愉快心情,來看以下 test 提供的菜單

對檔案、目錄的偵測選項

-a file 偵測檔案是否"存在"

-b file 偵測是否為 block special file

-c file 偵測是否為 characters special file

-d file 偵測是否為目錄

-e file 偵測檔案是否"存在"

-f file 偵測是否為 regular file

-g file 偵測檔案是否有 set-group-id 設定

-h file 偵測是否為"連結"檔案(symbolic link)

-k file 偵測檔案是否有 sticky 設定

-p file 偵測是否為 FIFO

-r file 偵測你對該檔案是否有"讀"的權限(read)

-s file 偵測檔案大小是否"大於零"(空檔案的值為"偽")

-t fd 偵測你的 fd 描述元是否已被終端機打開(當忽略 fd 描述元

時,系統預設值為 1)

-u file 偵測是否有 setuid 設定

-w file 偵測你是否有檔案"寫"的權限(write)

-x file 偵測你是否有檔案"執行"的權限(execute)

-O file 偵測你是否為檔案的擁有者(Owner)

-G file 偵測你是否為檔案的群組使用者(Group)

-L file 偵測"連結"檔案(symbolic link)

-S file 偵測檔案是否為 socket

-N file 偵測檔案最後修改的時間是否在最後閱讀時間之後

以上是 bash 提供的選項資料集(不同的 shell 會多少有差異)。所有選項均以條件成立回應"真"

值,不成立則回應"偽"。這類的選項,常用到的話,自然就能記她幾個;不常用,忘個精光也關

係。因為你隨時可以在 on-line namual 中查到她們。理解他們能做些什麼就夠了。(以上說法,

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 288

test

腦容量有限的農夫個人的做法,這項做法是基於實際與實用的經濟性考量。不適用於喜歡上補習

班、喜歡考試拿分數、喜歡有執照的高級工程師效法)

在撰寫 shell script 時,test 較常以另一種形式出現,就是將她放在 [] 括號裡面。來看前例

轉換成這種形式的應用

[Farmer_Akira@www]# [ -r /etc/httpd/logs/access_log ] && echo Readable

Readable

[Farmer_Akira@www]# [ -d /etc/httpd/logs ] && echo Directory exist

Directory exist

[Farmer_Akira@www]#

你可以看到我使用括號來偵測,然後使用“&&”做條件判斷是否執行。這用法和先前的例子,在

邏輯性上並沒有差別。(“&&”的意義在 bash 與 c shell 的定義是相同的,參考說明請按此)

到目前為止,我所提到都是單一性的偵測。雖然舉的都是在交談模式下的例子,但實際上他們也

以相同的方式運用在 shell script 中。我相信這應該很容易理解。接下來上我們來看 test 在"

比對"方面的運用。

對字串的偵測與比較

test 可以偵測單一字串的長度、內容,或者是比對兩個字串的長度或內容相不相等。這是她"比

對"文字字串的能力。先看相關的選項

字串偵測、比對模式

st 偵測 st 字串長度是否"大於零(no null)"

-z st 偵測 st 字串長度是否為"零"

-n st 偵測 st 字串長度是否"大於零(no null)"

st1 = st2 比對 st1 與 st2 兩字串是否"相等"

st1 != st2 比對 st1 與 st2 兩字串是否"不相等"

你可看到三個關於字串長度是否為零的項目,其實相當於兩個,st 與 -n st 效用的相同的。而 -z

則是前者的反向邏輯偵測。當然,選項還是以條件成立為"真",不成立為"偽"。

空、不空的問題,是個問題

[Farmer Akira@www]# akst1=

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 289

test

[Farmer_Akira@www]# akst2=""

[Farmer_Akira@www]# akst3=" "

上面我設定了三個變數。akst1 是空的變數,完全沒有內容,可說是長度為零的變數。akst2 變

數在雙括號內,但完全沒以內容,所以也是空的。akst3 變數的內容是雙括號內的五個 SPACE 字

元,所以不是零長度的字串。需特別注意的是 shell 對 SPACE 字元的處理,在某種情況下 SPACE

字元會被忽略而造成問題。

[Farmer_Akira@www]# if [ $akst3 = " " ]

>then

>echo True

>fi

[: =: unary operator expected

[Farmer_Akira@www]#

上面的語法雖然是合理的,但由於碰到 shell 會忽略 SPACE 字元,所以 $akst3 代入的內容被

shell 完全沒看到。因此 test 來失去了第一個引數,造成使用語法錯誤。這就是五個 SPACE 字

元所造成的問題。要避免 shell 的忽略效應,變數必須使用雙引號來括住。就如同我使用雙引號

括住五個 SPACE 字元一樣。

[Farmer_Akira@www]# if [ "$akst3" = " " ]

>then

>echo True

>fi

True

[Farmer_Akira@www]#

以上是撰寫 shell script 時,容易犯卻不容易察覺的陷阱。所以處理內容可能為"空"的變數多

加小心。再讓我們來看一個詭異的例子

[Farmer_Akira@www]# akst1=

[Farmer_Akira@www]# test -z $akst1

[Farmer_Akira@www]# echo $?

[Farmer_Akira@www]# 0

[Farmer_Akira@www]# test -n $akst1

[Farmer Akira@www]# echo $?

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 290

test

[Farmer_Akira@www]# 0

這種錯誤,一樣可以透過雙引號括住變數的方法得到解決

[Farmer_Akira@www]#

[Farmer_Akira@www]# test -z "$akst"

[Farmer_Akira@www]# echo $?

[Farmer_Akira@www]# 0

[Farmer_Akira@www]# test -n "$akst"

[Farmer_Akira@www]# echo $?

[Farmer_Akira@www]# 1

這個問題,我就寫到這裡。接下來,看正常應用的例子

[Farmer_Akira@www]# cat test-steq

#!/bin/bash

ST1=$1

ST2=$2

if [ -z "$1" ] #測試 arg1 是否為"空字串"

then

echo "No command-line argument 1."

exit 1

fi

if [ -z "$2" ] #測試 arg2 是否為"空字串"

then

echo "No command-line argument 2."

exit 1

fi

if [ "$ST1" = "$ST2" ] #測試 arg1 內容是否等於 arg2

then

echo "$ST1 is equal to $ST2"

else

echo "$ST1 is no equal to $ST2"

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 291

test

fi

exit 0

test-steq 做的事情只是簡單地比對 script 的 arg1 與 arg2 是否相等。因為使用時有可能會

忘記輸入 arg1 或 arg2,所以我加上 arg1 與 arg2 是否為"空字串"的偵測。當她們是空字串

時,會顯示訊息然後以狀態值 1 結束 script 的執行。這是一個正邏輯的例子。接著來看另一個

例子 test-n

[Farmer_Akira@www]# cat test-n

#!/bin/bash

if [ -n $1 ] #錯誤的 -n 偵測使用

then

echo "No null is true." #偵測回應永為"真值"

else

echo "No null is false."

fi

if [ -n "$1" ] #正確的 -n 偵測使用"

then

echo "No null is true."

else

echo "No null is false."

fi

選項 -n 偵測的是"非零長度"的字串。第一段是使用上的陷阱,其偵測值永遠是"真值"。在這裡

特再強調一次,對偵測關於零長度的變數,應該加上雙括號,以避免語法錯誤。使用請務必小心。

字元字串除了偵測零長度以及內容的比對外,還能以她所代表的 ASCII 碼(註*)來比較大小。不

過這個字元比較大小的法則可與一般慣用的十進位的數字觀念稍有不同。以下是幾個字元字串的

大小關係

0 < 0.1 < 00 < 12 < 3 < 3999 < 4 < A < B < aaz999 < ab < b < bx < ~

乍看之下,實在有點沒大沒小。其實他們的大小可是井然有序的。比法很簡單,先比第一位字元,

能分的出大小,就沒必要再往下比了。如果相等,就再接著比第二個字元。字元的大小以 ASCII 碼

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 292

test

的大小為依據,"空字元"的 ASCII 代碼就是 0,也最小的一個。現在我相信,你回頭應該可以一

眼看出"大小"了吧!當然,必要時你可以多看幾遍。以下讓我們來看她運用的實例

[Farmer_Akira@www]# cat test-st

#!/bin/bash

if [[ "$1" < "$2" ]] #這一行可以改寫成 if [ "$1" \< "$2" ]

then

echo "$1 < $2"

fi

上例,你可以帶入兩個引數來做比較。請注意雙括號的使用。

對數字的偵測與比較

test 在數字方面的支援是比較兩個數字是否相等(-eq)、不

相等(-ne)、大於(-gt)、大於等於(-ge)、小於(-lt)、小於

等於(-le)。這也就是右表所描述的功能。和先前一樣,條件

成立回應"真",不成立回應"偽"。

實際運用有兩種型式,其一就是使用先前的功能代碼,其二

則是在 (...) 內使用符號(==, >, >=, <, <=)。兩者的語法

有些許差異的。我個人習慣使用前者。

這兩者使用時都需留意帶入的數字是否是--"整數"。因為帶

入"非整數"會出現錯誤訊息,還會得固定得到"偽"的判斷值。讓我們還看以下簡單的例子

[Farmer_Akira@www]# cat test-number01

#!/bin/bash

a=30

if [ $1 -lt $a ]

then

echo "$1 is less than $a"

else

echo "$1 is greater than $a"

fi

if (( $1 < $a ))

數字偵測、比較

-eq 等於

-gt 大於

-ge 大於等於

-ne 不等於

-lt 小於

-le 小於等於

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 293

test

then

echo "$1 is less than $a"

else

echo "$1 is greater than $a"

fi

[Farmer_Akira@www]# ./test-number01 10

10 is less than 30

10 is less than 30

[Farmer_Akira@www]# ./test-number01 40

40 is greater than 30

40 is greater than 30

[Farmer_Akira@www]# ./test-number01 10.1

test-number01: [: 10.1: integer expression expected

10.1 is greater than 30

test-number01: ((: 10.1 < 30 : syntax error in expression (error token is ".1 < 30 ")

10.1 is greater than 30

上例的最後我刻意帶入非整數值,果然得到免費的錯誤訊息以及發瘋的執行結果 -- 10.1 is

greater than 30。所以 -- 不支援"非整數",小心 HAL 抓狂。

邏輯符號的組合運用

在此之上的功能,我相信看倌們能理解他們均是單一的功

能,有些則是只有正向邏輯的偵測。如果只有這些那面對實

際運用實在缺乏彈性。因此 test 支援幾個邏輯符號,善用

他們對 script 的"效能"提昇是有所幫物的。

譬如,我要 script 偵測某目錄,如果不存在便自動建立該目錄。當我想要這樣做時,我第一個

想到的是使用 -d 來做偵測,但她是以目錄"存在"為真值,所以剛好和我需要的相反。像這種情

況,我就可以藉助邏輯符號 "!" 來做到 -d 的反向邏輯。

[Farmer_Akira@www]# cat test-nd

#!/bin/bash

if [ ! -d /home/system-patch ]

then

邏輯符號

! NOT, 非

-a AND

-o OR

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 294

test

mkdir /home/system-patch

fi

以上是反向邏輯的簡單實例。有時 script 會需要同時對多項條件做偵測。也就是說,必須對偵

測的對象做 AND 或 OR 的邏輯組合。這種情況可以使用邏輯符號 -a(AND), -o(OR)。來看以下的

例子

[Farmer_Akira@www]# cat test-logic01

#!/bin/bash

if [ -f /usr/bin/netscape -a -f /home/web2002/index.html ]

then

netscape /home/web2002/index.html

fi

[Farmer_Akira@www]# cat test-logic02

#!/bin/bash

if [ $# -ne 1 -o -z "$1" ]

then

echo usage: $0 non_zero_string

else

if [ "$1" = akira -o "$1" = AKIRA ]

then

..... # akira option

elif [ "$1" = backup -o "$1" = weekday ]

then

..... # weekday backup option

else

..... # special record "$1" option

fi

fi

例子 test-logic01 中,我想偵測 /usr/bin/netscape 與 /home/web2002/index.html 這兩個檔

案是否存在皆屬於"真"。所以我使用 -a(AND) 來銜接兩個檔案的偵測,只有當她前後兩個偵測值

均為"真"值時,她才會回應"真"值。第二個例子 test-logic02 則是使用 -o(OR) 銜接兩個偵測,

只要其中有一個偵測成立,以"真"值回應。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 295

test

如果在同一個式子裡面同時有 -a(AND) 與 -o(OR) 混用時,處理的次序是先做 -a(AND) 然後在

處理 -o(OR)。也可以說 -a(AND) 比 -o(OR) 較高優先處理。

[Farmer_Akira@www]# cat test-logic03

#!/bin/bash

a=10

if [ "$a" -eq "$1" -o "$1" -ge 1 -a "$1" -le 7 ]

then

echo "$1 match process range"

fi

#if [ "$a" -eq "$1" -o \( "$1" -ge 1 -a "$1" -le 7 \) ] #相同效果的不同寫法

#then

# echo "$1 match process range"

#fi

上例 test-logic03,我設定的判斷式作用為,當 $1 的內容是 1~7 的整數,或者是 $1 等於特

定的變數 a 時。我便認定 $1 是有效值。

第一段,是自然的寫法,判斷式會先做 "$1" -ge 1 -a "$1" -le 7;然後其結果再與 "$a" -ne "$1"

做 -o(OR)。

第二段,是如何加上括號的寫法。我刻意加上括號,括號擺的位置設定則是第一段的作用相同。

當然有需要時,我也可以使用這個方法,來設定我需要的邏輯組合。

寫到這裡,我必須說,電腦語言通常其規範與支援的法則多半是固定的,但運用組合所衍生的可

能性卻是相當多變的。希望您能正確地理解這些法則,活用善用你的智慧。這段就先寫到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 296

time

time

指令語法

time [options] command [arguments...]

指令說明

time 指令能約略統計指定執行指令所耗用的 CPU 時間及系統資源等資訊。指令支援自訂顯示格

式,支援的資料欄位相當多。例如 CPU 時間、記憶體、輸入輸出等等。

選項說明

-p

顯示 POSIX 規格相容格式。資料為 real %e, user %U, sys %S,分三行顯示。

GNU 選項

-f FORMAT, --format=FORMAT

自訂顯示格式。可引用的項目請參考後面的說明。

-p, --portability

同上。

-o FILE, --output=FILE

將統計資訊轉存到指定檔案。(不包含指定指令的輸出)

-a, --append

將結果寫到檔案的末端,不覆蓋掉原來的內容。(與 -0 選項配合使用)

-v, --verbose

人性化列出指定程式所有運用的資源項目。

--help

顯示程式用法資訊

-V, --version

顯示程式本身的版本資訊

自訂格式的欄位符號說明

以下的資料欄位是支援 -f 選項使用的。運用時可以配合 \t, \n, \\ 等符號併用。\t 表示跳格,

\n 為換行,\\ 將會顯示倒斜線符號。連續性的欄位顯示必須使用引號或雙引號來括用引用的欄

位。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 297

time

Time

%E

執行指令所花費的時間,格式是:[hour]:minute:second。請注意這個數位並不代表實際的 CPU 時

%e

執行指令所花費的時間,單位是秒。請注意這個數位並不代表實際的 CPU 時間。(Not in tcsh)

%S

指令執行時在核心模式(kernel mode)所花費的時間,單位是秒。

%U

指令執行時在使用者模式(user mode)所花費的時間,單位是秒。

%P

執行指令時 CPU 佔用的百分比。這個數位是核心模式加上使用者模式的 CPU 時間除以總時間。

Memory

%M

執行時所佔用的實體記憶體的最大值。單位是 Kbytes

%t

執行時所佔用的實體記憶體的平均值,單位 Kbytes (Not in tcsh)

%K

執行程式所佔用的記憶體總量 (data+stack+text) 的平均大小,單位 Kbytes

%D

執行程式的自有資料區(unshared data area)的平均大小,單位 Kbytes

%p

執行程式的自有堆疊(unshared stack)的平均大小,單位 Kbytes (Not in tcsh)

%X

執行程式間共用內容(shared text)的平均值,單位 Kbytes

%Z

系統記憶體頁的大小,單位 byte。對同一個系統來說這是個常數 (Not in tcsh.)

%F

程式的主要記憶體頁錯誤發生次數。所謂的主要記憶體頁錯誤是指某一記憶體頁已經置換到置換

檔(swap file)中,而且已經分配給其他程式。此時該頁的內容必須從置換檔裏再讀出來。

%R

程式的次要記憶體頁錯誤發生次數。所謂的次要記憶體頁錯誤是指某一記憶體頁雖然已經置換到

置換檔中,但尚未分配給其他程式。此時該頁的內容並未被破壞,不必從置換檔裏讀出來

%W

程式被交換到置換檔的次數

%c

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 298

time

程式被強迫中斷的次數(像是分配到的 CPU 時間耗盡)

%w

程式進入等待的次數(像是在等待某一個 I/O 執行完畢,譬如磁碟讀取..)

I/O

%I

程式所輸入的檔案數

%O

程式所輸出的檔案數

%r

程式所收到的 Socket Message

%s

程式所送出的 Socket Message

%k

程式接收到的信號數量

%C

執行時的參數以及指令名稱 (Not in tcsh)

%x

指令結束的執行狀態值 (Not in tcsh.)

實例說明

通常除非有特殊目的,否則不至於會想要用 time 來統計程式的資源耗用狀況。如果您對 time 所

支援的眾多選項還不甚熟悉的話,農夫個人建議,先用 -v 選項,看下例

# /usr/bin/time -v ps

...指令輸出(略)

Command being timed: "ps"

User time (seconds): 0.00

System time (seconds): 0.01

Percent of CPU this job got: 6%

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.14

Average shared text size (kbytes): 0

Average unshared data size (kbytes): 0

Average stack size (kbytes): 0

Average total size (kbytes): 0

Maximum resident set size (kbytes): 0

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 299

time

Average resident set size (kbytes): 0

Major (requiring I/O) page faults: 200

Minor (reclaiming a frame) page faults: 64

Voluntary context switches: 0

Involuntary context switches: 0

Swaps: 0

File system inputs: 0

File system outputs: 0

Socket messages sent: 0

Socket messages received: 0

Signals delivered: 0

Page size (bytes): 4096

Exit status: 0

#

選項 -v 以較人性的用詞顯示出指令用到的所有資源項目。這對理解指令執行狀態有相當的幫助。

自訂輸出格式

底下,你所見的是在 bash 中執行的例子。基本上,連續性的欄位格式,必須用引號或雙引號來

括住。這點務必留意。

# /usr/bin/time -f '%U %e %S' ps

...指令輸出(略)

0.01 0.01 0.00

#

再來看個加上 \t \n 的型態組合

# /usr/bin/time -f '%U \t %e \n %S' ps

...指令輸出(略)

0.00 0.01

0.01

#

相關於 shell 的環境問題

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 300

time

對 bash 的使用者而言,請注意。對 bash 而言,time 是個保留字。在此所提的選項,如果不使

用絕對路徑,bash 會產生錯誤訊息給你。在 bash 環境下的輸出格式設定可以藉由環境變數

TIMEFORMAT 來設定。但對 tcsh 使用者而言,則有同名的內建指令。與此所介紹的有所不同,但

指令的基本作用是相同的。這篇暫時簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 301

time (tcsh)

time (tcsh)

指令語法

tcsh

time [command]

指令說明

基本上,tcsh 內建的 time 指令與外部指令 time 在功能上均是提供執行指令的資源耗用統計。

內建指令 time 的適用範圍有一定的限制。她僅適用於符合 shell 所定義的 simple command。

且不適用於 alias 或 pipeline 所連貫的指令組合、或命令清單(command list) 及括符內的命

令清單等。

當沒有代入 command 時,則顯示當前 shell 以及她的子程序的耗用資源統計。

實例說明

% time find / -name chw -print

/root/akbin/chw

0.550u 1.260s 2:03.11 1.4% 0+0k 0+0io 169pf+0w

%

以上是個用 time 來顯示 find 指令找尋檔案的例子。大體上顯示的資料格式分成七個部分,我

們用上例的輸出來做實際的說明,

• 第一部份“0.550u”為使用者時間(user time)

• 第二部份“1.260s”為系統時間(system time)

• 第三部份“2:03.11”為實耗時間(elapsed time)

• 第四部份“1.4%”是第一部份的使用者時間加上第二部份系統時間後除以第三部份實耗

時間的百分比

• 第五部份“0+0k”為系統的平均分配(shared)記憶體與 unshared 記憶體的大小

• 第六部份“0+0io”為輸入與輸出的資料 block 數量

• 第七部份“169pf+0w”則代表 page fault 次數與 swap 的大小。

除了計算指令之外,time 還有另一個作用,如果我們不代入指令引數的話...

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 302

time (tcsh)

% time

20.730u 2.140s 43:29.88 0.8% 0+0k 0+0io 58960pf+0w

%

這種情況下的 time 會顯示當前 shell 的資源耗用總和。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 303

times

times

指令語法

times

指令說明

這個內建指令會顯示你當前的 shell 所耗用的系統資源。顯示的資料統計是 shell 本身以及在

該 shell 中所有被執行的程序的系統時間總和。

實例說明

# times

0m0.130s 0m0.030s

0m1.050s 0m0.240s

#

以上是指令的執行顯示,第一行是 shell 本身耗用的時間,第二行是在 shell 中所有程序的時

間累計。每行的第一欄為 utime(user),第二欄為 stime(system)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 304

top

top

指令語法

top [-] [d delay] [p pid] [q] [c] [C] [S] [s] [i] [n iter] [b]

指令說明

top 可以說是個相當好的程序監視指令。指令針對系統正在執行的程序,彙整排序,並顯示到標

準輸出,資料會定時(單位秒)自動更新。這對連續性的監控系統的程序執行狀態,是相當有用的

工具。

不僅如此,最令人讚嘆的是指令提供一組交談命令,讓我們在指令執行中,重新排序資料、欄位

調控、甚至於執行 kill 刪除指定的程序...等等。這是農夫個人相當激賞的指令。

選項說明

d delay

自訂資料更新顯示的間格(delay),以秒為計數單位。

p pid

監控指定的特定程序。

q

忽略顯示間格限制,持續不斷更新顯示資訊。(謹慎使用,而其是 root)

S

累計模式。這個選項對於程序的 CPU 計時是包含了程序及其子程序的時間。

s

安全模式。在本模式下,取消了有幾項具潛在危險的交談命令。

i

忽略閒置(idle)或呆滯(zombie)程序。

C

顯示所有的 CPU 總計。(SMP 模式使用)

c

顯示程序的指令名稱、路徑、環境變數。

n

指定資訊更新的次數。到達指定次數,指令便會自動終止執行。

b

批次處理模式。將 top 輸出存檔或傳送到另一個程式時使用。本模式不接受指令交談命令的輸

入。配合 n 選項時,在到達指定次數後,指令會自動終結。除此之外則必須使用強制中斷。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 305

top

交談命令

以下的交談命令,提供我們在 top 指令執行中使用的。熟悉這些功能,對我們觀察資訊有相當的

幫助。其實這組命令可以說是 top 指令最令人激賞的地方....

space

立即更新資料顯示。

^L

清除畫面,重新顯示。

"h or ?"

顯示線上操作說明。

k

終止指定的執行程序。相當執行 kill 指令功能。

i

開啟或關閉顯示閒置及呆滯程序。

I

置換 Solaris(CPU percentage divided by total number of CPUs)及 Irix(CPU percentage

calculated solely by amount of time)模式。

"n or #"

設定需要顯示的程序數量,若指定為 0,顯示的程序自動充滿 tty 畫面。其實這也是預設值。

q

結束程式。

r

調整指定的執行程序 nice 值。這項命令與執行 renice 相似。nice 值的使用規範請參考 nice

指令。請注意,這項命令無法在安全模式下使用。

S

開啟或關閉顯示累計模式。

s

自訂資料更新的時間間隔。以秒為單位。請注意,這項命令無法在安全模式下使用。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 306

top

"f or F"

指定新增或移除顯示欄位。

"o or O"

調整資料欄位的顯示順序。

l

開啟或關閉 load average 顯示。

m

開啟或關閉 memory 顯示。

t

開啟或關閉執行程序統計與 CPU 狀態顯示。

c

開啟或關閉指令名稱顯示。

N

以 PID 欄位排序顯示。

A

以程序執行的先後排序。

P

以 %CPU 欄位排序顯示。(指令預設值)

M

以 %MEM 欄位排序顯示。

T

以 TIME 欄位排序顯示。

W

將目前的指令顯示狀態設定,寫到 ~/.toprc 檔案中。

實例說明

以下的框內的資料,是預設的 top 指令顯示

06:35:38 up 4 days, 17:06, 5 users, load average: 0.07, 0.07, 0.08

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 307

top

96 processes: 95 sleeping, 1 running, 0 zombie, 0 stopped

CPU states: 7.3% user 0.6% system 0.0% nice 0.0% iowait 91.9% idle

Mem: 481536k av, 418332k used, 63204k free, 0k shrd, 112316k buff

303096k actv, 15376k in_d, 3092k in_c

Swap: 979924k av, 55444k used, 924480k free 184436k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

30270 root 15 0 79156 32M 328 S 4.9 6.9 60:37 0 X

1 root 15 0 112 80 56 S 0.0 0.0 0:04 0 init

2 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 keventd

3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd

4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0 ksoftirqd_CPU0

9 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 bdflush

...下略

基本上,顯示的資料大略可分成"系統資訊彙整"以及"執行程序狀態"兩大部分。

系統資訊彙整的資料從字面上的意義不難理解,在此就不再多做解釋。執行程序狀態的欄位是允

許我們自由更動的,改變的方式也相當容易,只要鍵入 f 或 F,你就可以看到以下的畫面

Current Field Order: AbcDgHIjklMnoTP|qrsuzyV{EFW[X

Toggle fields with a-x, any other key to return:

* A: PID = Process Id

B: PPID = Parent Process Id

C: UID = User Id

* D: USER = User Name

* E: %CPU = CPU Usage

* F: %MEM = Memory Usage

G: TTY = Controlling tty

* H: PRI = Priority

* I: NI = Nice Value

J: PAGEIN = Page Fault Count

K: TSIZE = Code Size (kb)

L: DSIZE = Data+Stack Size (kb)

* M: SIZE = Virtual Image Size (kb)

N: TRS = Resident Text Size (kb)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 308

top

O: SWAP = Swapped kb

* P: SHARE = Shared Pages (kb)

Q: A = Accessed Page count

R: WP = Write Protected Pages

S: D = Dirty Pages

* T: RSS = Resident Set Size (kb)

U: WCHAN = Sleeping in Function

* V: STAT = Process Status

* W: TIME = CPU Time

* X: COMMAND = Command

Y: LC = Last used CPU (expect this to change regularly)

Z: FLAGS = Task Flags (see linux/sched.h)

* [: CPU = (null)

其他的功能,您可參考前面的"交談命令",自己實際操作..你會得到更多。這篇暫時簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 309

touch

touch

指令語法

touch [OPTION]... FILE...

touch [-acm] MMDDhhmm[YY] FILE... (obsolescent)

指令說明

藉由這個指令,我們可以同時或單獨變更檔案的兩種時間紀錄,讀取時間(access time)以及修改

時間(modification time)。

選項說明

-a :更改文件的讀取時間(access time)

-c, --no-create :不建立任何新檔案

-m :更改文件的修改時間(modification time)

-t STAMP :設定"特定時間"來代替"目前時間",格式 [[CC]YY]MMDDhhmm[.ss]

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實例說明

空檔案

# touch file-touch1

# ls -l

total 0

-rw-r--r-- 1 root root 0 7 月 9 13:53 file-touch1

#

一般狀況下使用 touch 指令變更檔案時間,如果檔案不存在,touch 會自動建立指定的檔案(空

檔案)。如果不想因使用 touch 而建立任何新檔案,必須加上選項 -c

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 310

touch

# touch -c file-touch2

touch: setting times of `file-touch2': 沒有此一檔案或目錄

#

指令的執行結果是出現一段錯誤訊息,因為指定的檔案不存在。這正是加上選項 -c 的目的。

更新檔案時間

touch 指令一般是以下指令當時的電腦時間來作為更新檔案的時間。但也提供特殊的選項 -t 來

指定"特定的時間"作為更新時間。

為了舉例的方便,我原封不定地,拷貝一隻已建檔許久的系統程式 -- tcsh

# cp -a /bin/tcsh .

# ls --full-time

total 288

-rwxr-xr-x 1 root root 288604 週一 6 月 25 03:45:26 2001 tcsh

#

這隻程式的最後修改時間是 -- 2001 年 6 月 25 日 3 點 45 分 26 秒。

現在,我因監控上的需要,打算將檔案時間變更為 2002 年 7 月 1 日 8 點 00 分 01 秒。最簡

單有效的作法如下

# touch -t 200207010800.01 tcsh

# ls --full-time

total 288

-rwxr-xr-x 1 root root 288604 週一 7 月 01 08:00:01 2002 tcsh

選項的語法很單純,就是直接鍵入西元的年月日時分數字即可,其間不需任何分隔。如果要加上

秒數,做法比較特別,需使用小點"."來與前段區隔。

當然,在有需要時,touch 指令也支援"讀取時間"或"修改時間"的單獨變更。

# touch -at 200207022300 tcsh

# ls -lu

total 288

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 311

touch

-rwxr-xr-x 1 root root 288604 7 月 2 23:00 tcsh

#

上例是單獨變更"讀取時間", 下例則是變更"修改時間"

# touch -mt 200206302300 tcsh

# ls -l

total 288

-rwxr-xr-x 1 root root 288604 6 月 30 23:00 tcsh

# ls -lu

total 288

-rwxr-xr-x 1 root root 288604 7 月 2 23:00 tcsh

#

以上這些例子,即是大體上 touch 的運用。這篇就暫時先寫到這裡好了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 312

tr

tr

指令語法

tr [OPTION]... SET1 [SET2]

指令說明

這指令是個字元過濾器,資料由標準輸入流入,經過指令的指定轉換後,再導向標準輸出。感覺

上很像一個篩子。

基本上,指令一次處理一個字元,所以不具備識別"英文單字"這種特定順序的字元組合。目前這

個指令也不適合處理中文檔案。

指令選項

-c, --complement

:反選設定字元。也就是符合 SET1 的部份不做處理,不符合的剩餘部份才進

行轉換

-d, --delete :刪除指令字元

-s, --squeeze-repeats :縮減連續重複的字元成指定的單個字元

-t, --truncate-set1 :削減 SET1 指定範圍,使之與 SET2 設定長度相等

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

以下是特定的字元設定(SETs),與他們所代表的意義

\NNN 8 進位的 ASCII 碼

\\ 倒斜線(backslash)

\a 警示聲 (BEL)

\b 游標倒退一格字元(backspace)

\c 在行尾不加上換行字元(同 -n 選項的作用)

\f 換頁(form feed)

\n 換行(new line)

\r 游標回歸行首(carriage return)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 313

tr

\t 水平跳格(horizontal tab)

\v 垂直跳格(vertical tab)

CHAR1-CHAR2

:字元範圍從 CHAR1 到 CHAR2 的指定,範圍的指定以 ASCII 碼的次序為基

礎,只能由小到大,不能由大到小。

[CHAR*] :這是 SET2 專用的設定,功能是重複指定的字元到與 SET1 相同長

度為止

[CHAR*REPEAT]

:這也是 SET2 專用的設定,功能是重複指定的字元到設定的 REPEAT 次數為

止(REPEAT 的數字採 8 進位制計算,以 0 為開始)

[:alnum:] :所有字母字元與數字

[:alpha:] :所有字母字元

[:blank:] :所有水平空格

[:cntrl:] :所有控制字元

[:digit:] :所有數字

[:graph:] :所有可列印的字元(不包含空白字元)

[:lower:] :所有小寫字母

[:print:] :所有可列印的字元(包含空白字元)

[:punct:] :所有標點字元

[:space:] :所有水平與垂直空白字元

[:upper:] :所有大寫字母

[:xdigit:] :所有 16 進位制的數字

[=CHAR=] :所有符合指定的字元(等號裡的 CHAR,代表你可自訂的字元)

實務說明

以下兩種型態是運用 tr 指令常見的模式。

# cat file-A | tr [A-Z] [a-z]

# tr [A-Z] [a-z] < file-A > file-a

基本上 tr 屬於搭配型指令,因此資料通常藉由 pipeline(符號"|") 或 input redirection(符

號"<")來導入,其指令本身並不支援檔案的呼叫。導入的資料經由 tr 過濾轉換後會導向標準輸

出顯示在螢幕上。

大小字母的轉換

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 314

tr

tr 指令非常適合用來做大小寫字母的轉換。

# tr [:upper:] [:lower:] < file-A > file-a

# tr [:lower:] [:upper:] < file-b> file-B

第一行是將大寫字母轉成小寫字母,第二行則是小寫字母轉成大寫字母。兩行使用的語法則是特

定的寫法,其實也可以改寫如下

# tr 'A-Z' 'a-z' < file-A > file-a

# tr 'a-z' 'A-Z' < file-b> file-B

這種寫法比較簡短,我個人也比較慣用。其實用這種寫法有一個好處,當我想將一個文字檔案的

大小寫全部反過來時,這個語法可以做到。來看下面的例子

# cat file-Aa

SEE ALSO

The full documentation for tr is maintained as a Texinfo manual.

If the info and tr programs are properly installed at your site,

the command

info tr

should give you access to the complete manual.

#

這是一個普通的文字檔案,使用 tr 可以容易地將整個檔案的大小寫字母反過來,如下

# tr 'a-zA-Z' 'A-Za-z' < file-Aa | tee file-aA

see also

tHE FULL DOCUMENTATION FOR TR IS MAINTAINED AS A tEXINFO MANUAL.

iF THE INFO AND TR PROGRAMS ARE PROPERLY INSTALLED AT YOUR SITE,

THE COMMAND

INFO TR

SHOULD GIVE YOU ACCESS TO THE COMPLETE MANUAL.

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 315

tr

呀喝!豬羊變色。新檔案 file-aA 的大寫的字母轉成小寫字母。

簡單的字母代替文字加密

在多人多工的 UNIX 或 Linux OS 中,一般使用者其實很難保有隱私,因為永遠還有一個人可以

查看管理你的私人檔案,那就是你的系統管理者。所以當你需要在這樣一個公共空間裡,保有一

點基本的自我隱私時,文件最好為它加密。

tr 可以產生趣味大於實質用途的加密,方法簡單如下

# tr 'a-z ' 'qazwsxedc rfvtgbyhnujmikolp' < file-Aa | tee file-SAa

SEEpALSO

TdspxjffpwgzjvstuqucgtpxghpuhpcnpvqctuqctswpqnpqpTskctxgpvqtjqf.p

Ixpudspctxgpqtwpuhpbhgehqvnpqhspbhgbshfopctnuqffswpqupogjhpncus,p

udspzgvvqtw

pctxgpuh

ndgjfwpecmspogjpqzzsnnpugpudspzgvbfsuspvqtjqf.p

#

為了舉例方便,密碼字母集我只設定小寫字母。如果真想用的話,最好將整個 ASCII 全部代替會

比較理想。同時為了安全起見,指令不可在交談模式下使用,因為程序有可能正被觀察中,同時

也必須注意 history 功能是否儲存的密碼字母集。最好的方式是將程序寫成 script 來執行,當

然密碼字母集不可包含在其中。

解密的過程只需將正確的密碼字母集放到 SET1 將替換的程序反過來即可...

# tr 'qazwsxedc rfvtgbyhnujmikolp' 'a-z ' < file-SAa

SEE ALSO

The full documentation for tr is maintained as a Texinfo manual.

If the info and tr programs are properly installed at your site,

the command

info tr

should give you access to the complete manual.

#

這種加密法適合 100 個字母以內的簡短訊息使用,絕對可以蒙過一些小 Q蛋,只是碰上頻率分析

法專家會被笑而已。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 316

tr

壓縮過多的連續空白或空行

# tr -s ' ' ' ' < file

對空白過多的文字檔案,這個做法可以簡單迅速地解決。如果對象是空行,也可以使用

# tr -s '\n' '\n' < file

所以相似的問題,都可藉由 -s 選項做有效的縮減。

讓轉換參數做 1對 1的有效對應

有時一不小心 SET1 的範圍指定多過對應到 SET2 的指定時,執行結果會有小問題,來看下例

# cat file-a

a

ab

abc

abcd efgh ijkl

# tr 'a-z' '012' < file-a

0

01

012

0122 2222 2222

也就是說,SET1 對應到 SET2 的關係變成 a 轉換成 0, b 轉換成 1, c-z 轉換成 2。通常,最

後的 c-z 對應多半是設定時沒有預料到的對應關係。

要避免或限制這種效應,可以加上 -t 選項

# tr -t 'a-z' '012' < file-a

0

01

012

012d efgh ijkl

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 317

tr

因 -t 選項,使對應關係改變成 a 轉換成 0, b 轉換成 1, c 轉換成 2, d-z 因 SET2 沒有設定

而不做任何轉換對應。這篇暫時寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 318

trap

trap

指令語法

bash

trap [-lp] [arg] [sigspec ...]

指令說明

這個內建指令的名字取的相當有意思。trap 是"陷阱"的意思,她會捕捉我們所指定的信號

(sigspec),當符合指定的信號產生,trap 就會執行使用者交付給她的指令(arg)。通常會使用到

trap 大多是為了 debug script。我們可以就由她來了解 script 的執行細節或回報狀態。在交談

模式下則幾乎沒有使用她的理由。

當指令的 arg 沒有指令或帶入了 - 符號時,所有信號將會被回復成初始值。當 arg 為空字串,

則所有指定的信號將會被 shell 忽略執行帶入的指令。當指令使用 - p 選項同時沒有 arg 指定

時,顯示 sigspec 信號的指令。

基本上 sigspec 允許以名稱或數字來代入。EXIT(0) 代表退出 shell 之後執行 arg 命令。DEBUG

代表每個簡單指令(Simple Commands[註 1])後執行 arg 命令。DEBUG trap 不執行來自於 until 或

while 迴圈,或 if 的判斷式,或 && 及 || 邏輯判斷等執行失敗的命令,還有執行狀態值被反

轉時也不予以執行。在交談模式下,使用選項 -l 可以顯示所有的信號名稱及相對應的數值資料。

實例說明

顯示信號名稱與對應的數值

# trap -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD

18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN

22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

30) SIGPWR 31) SIGSYS 33) SIGRTMIN 34) SIGRTMIN+1

35) SIGRTMIN+2 36) SIGRTMIN+3 37) SIGRTMIN+4 38) SIGRTMIN+5

39) SIGRTMIN+6 40) SIGRTMIN+7 41) SIGRTMIN+8 42) SIGRTMIN+9

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 319

trap

43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13

47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-14 50) SIGRTMAX-13

51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9

59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1

63) SIGRTMAX

55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5

#

看起來只是一份簡單的表列...但卻可以讓我們寫的很累....實在讓我越看越感覺敬畏。幸虧羅素

他老人家生的早,要不然,肯定活不到 49...

在 script 中的運用

請假設你面對一支數百行的 shell script,在空無一人的辨公室..深夜孤燈下的你在明明不該抽

煙的電腦房裡,一口一口地吐出無奈的 X 字煙霧...快咪上眼睛的頭腦中...你告訴自己...豬八

戒...豬八戒...怎麼...豬八戒(台語)

這時如果你能善用 trap 來觀察可疑點的執行狀態的話,或許有助於問題的解決。以下是個過度

簡化的簡陋例子...實際的運用大概也和以下相去不遠...

# cat trap01

#!/bin/bash

trap 'echo Varible Listing -- aa = $aa , bb = $bb' EXIT

aa=10

bb=21

exit 0

#

第一行的 trap 指令,我設定捕捉 EXIT 信號,用 echo 來顯示當時的變數數值..然後請假設你

在屬不清的問題迴圈中插入 exit 0,想知道當時的變數數值....或許善用的巧妙的話...收工就

有望了。

以下是上例的執行結果

# trap01

Varible Listing -- aa = 10 , bb = 21

#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 320

trap

或許,永遠用不到這個指令的人是幸福的...這篇暫時簡單到此。

備註: 這段當作功課好了,讓我偷懶一下....

*1 SHELL GRAMMAR -- Simple Commands

A simple command is a sequence of optional variable assignments followed by blank-separated

words and redirections, and terminated by a control operator. The first word specifies the

command to be executed, and is passed as argument zero. The remaining words are passed as

arguments to the invoked command.

The return value of a simple command is its exit status, or 128+n if the command is terminated

by signal n.

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 321

tree

tree

指令語法

tree [ -adfgilnpqstuxACDFN ] [ -P pattern ] [ -I pattern ] [ directory ... ]

指令說明

由於視窗工具當道,一般使用者運用 tree 的機會恐怕是不多。目前新的 RedHat 9.0 ,預設安

裝時已排除這個指令。所以,需要她的老古董們得自己安裝(放在第二片當中 tree-1.2-22)。

tree 指令在顯示目錄結構時可以借助 dircolors 來做多色顯示。相關的環境變數為

LS_COLORS;相關的設定檔案則是 /etc/DIR_COLORS 或者是 ~/.dircolors。前者是顏色設定的系

統預設檔案,後者是使用者自訂檔案。設定齊全的環境,即可使用 -C 選項來做多色顯示。

tree 指令除了顯示目錄結構外,也同時會將顯示子目錄以及檔案的總數累計。

選項說明

-a 顯示所有檔案(含 dot files 特殊檔案在內), 預設值不顯示 dot files。

-d 只顯示目錄(及子目錄)結構

-f 在檔案或目錄名稱前,顯示相對路徑

-i 只顯示檔案或目錄名稱,不附加顯示樹狀結構圖,通常此選項多半與 -f 選項合用,

可得到完整相對路徑的顯示

-l 顯示符號連結(symbolic links)目錄的內容

-x 只顯示該目錄所在的 file-system。如果其下的子目錄連結到不同於父目錄的

file-system,便不予顯示。

-P pattern 只顯示指定模式(pattern)的檔案。如果指定模式有關聯於 dot files 特殊檔

案,必須配合 -a 選項使用。運用 *, ?, [...], - 這類符號,其代表意義等同 Regular

Expressions 的規範。

-I pattern 排除顯示符合指定型態的檔案,(pattern 可使用萬用字元"*")

-p 增列權限顯示(同指令 ls -l 的權限顯示)

-s 增列檔案或目錄的大小

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 322

tree

-u 顯示使用者(孤兒檔案則顯示 UID)

-g 增列群組名稱或代碼

-D 在檔案或目錄名稱前增列最後更改時間(last modification time)

-F 附加符號識別顯示(等同於 ls 指令的 -F 選項, 目錄"/", 執行檔"*", 連結"@"...等)

-q 對檔名含有不可列印字元,以問號 "?" 來替代預設的脫字符號。

-N 對檔名含有不可列印字元,以脫字符號為預設表示。

-t 依據檔案或目錄的最後變更時間排序顯示

-n 不使用顏色顯示(若與 -C 選項併用,則以 -C 選項的功能為優先)

-C 使用 dircolors 的色彩設定顯示檔案,目錄等元件

-A 以 ANSI 繪圖字元顯示樹狀結構

相關檔案

/etc/DIR_COLORS 顏色顯示的設定檔(系統預設檔案)

~/.dircolors 使用者自訂的顏色顯示設定檔案

相關環境變數

LS_COLORS Color information created by dircolors

相關指令

dircolors(1L), ls(1L)

指令套件

tree-1.2-22

農夫發現這個指令在 RedHat 9.0 預設的安裝已經被取消了。有需要得自己裝,放在第二片當中。

實務說明

# pwd

/etc/httpd

# tree

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 323

tree

.

|-- conf

| |-- httpd.conf

| |-- httpd.conf-2004

| |-- httpd.conf-org

| |-- httpd.conf-tmp

| |-- httpd.conf~

|-- conf.d

| |-- README

| |-- auth_mysql.conf

| |-- mailman.conf

| |-- php.conf

| `-- php.conf~

|-- logs -> ../../var/log/httpd

|-- modules -> ../../usr/lib/httpd/modules

`-- run -> ../../var/run

5 directories, 12 files

#

| |-- httpd.conf-nuke

| `-- magic

就目前視窗環境的發展狀況來看,使用到這個指令的可能性實在有越來愈少的趨勢。這也難怪

RedHat 9.0 的預設安裝會排除 tree 相關的 rpm 了。這個指令支援的功能選項實在不少,農夫

我僅舉上例來做代表,其他的就留給有心人去探索了。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 324

type

type

指令語法

bash type [-aftpP] name [name ...]

指令說明

在 shell 交談模式下,當我們鍵入某個 name,而她是可執行的話,那這個 name 有幾種可能,

或 alias 或系統指令或 $PATH 設定的目錄中的可執行檔案。而這是指令的作用是,就是告訴我

們,鍵入的 name 到底是什麼。算是一個輔助性的指令。

選項說明

-a

顯示可找到的所有資訊。

-f

取消 shell 的函數查詢。

-t

只顯示類型。如 alias、file 等。

-p

當 name 的類型是 file 時,顯示 name 的完整路徑。

-P

強迫找尋 PATH 的所有目錄。

實例說明

當使用者想清楚執行的命令為何種型態時,可以借助 type 指令來澄清。

# type ls

ls is aliased to `ls --color=tty'

#

以上顯示的即是使用者在常態下使用 ls 的真正身份。此外 -a 選項可以讓我們看到所有的資訊。

# type -a ls

ls is aliased to `ls --color=tty'

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 325

type

ls is /bin/ls

#

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 326

ulimit

ulimit

指令語法

bash

ulimit [-SHacdflmnpstuv [limit]]

指令說明

內建指令 ulimit 可以用來顯示系統資源的 hard limit(-H 選項) 以及顯示與設定關於 shell

或執行程序的 soft limit(-S 選項)。hard limit 一旦設置,一般使用者就無法再將之調整放大。

一般使用者對現有的設定值也只允許往下修正,不可往上調整。

選項說明

-S

soft limit

-H

hard limit

-a

顯示當前所有的資源限制設定。

-c

核心資料轉存 core 檔案的最大上限。

-d

程序資料區段的最大上線。

-f

允許 shell 建立最大檔案上限。

-l

記憶體可鎖定的最大上限。

-m

常駐最大上限。

-n

開啟檔案描述的最大上限。(多數系統未支援此參數)

-p

以 512 位元組為管道(pipe)大小。(此參數可能無法改變)

-s

堆疊最大上限。

-t

佔用 CPU 時間最大上限。以秒為單位。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 327

ulimit

-u

單一使用者程序執行的最大數目。

-v

shell 可使用的虛擬記憶體最大上限。

實例說明

觀看系統資源使用限制

# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

max locked memory (kbytes, -l) unlimited

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 3839

virtual memory (kbytes, -v) unlimited

#

選項 -a 顯示目前已設定的資源使用限制的狀況。其實,就一般使用者的角度,多半是想將資源

放大,這點恰好是指令所不允許的。所以就各項設定值所提供的限度,在考量系統有多少可能的

負荷,僅可能做放大是管理者的責任。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 328

umask

umask

指令語法

bash

umask [-p] [-S] [mode]

tcsh

umask [value]

指令說明

每當使用者新增檔案或目錄時,預設的使用權限,就是由 umask 這個內建指令的設定值所規範的。

通常,umask 會被設定在 shell 的啟始檔案中。因此,如果您尚不曾自覺到自己的 home 目錄下

的啟始檔案,你可以看看是否有這項設定。如果沒有發現,那就是繼承來自系統的預設啟始檔。

對 bash 的使用者來說,個人的啟始檔案是 $HOME/.bashrc,使用者可以將 umask 設定在其中。

另外系統也有一個啟始檔案,像 RedHat 9 是放 /etc 之下,檔名為 bashrc,當使用者沒有自行

設定,umask 設定值便來自於此系統檔案的設定。tcsh 的個人啟始檔案為 ~/.tcshrc,系統設定

檔在 /etc/csh.cshrc。

umask 指令中的 nnn 所代表的意義與 chmod 指令的 nnn 相似。不同的是 chmod 指令 nnn 是

“給於”使用或者是將要改變的許可權限,而 umask 則是“取消”nnn 的使用許可權限。這點是

根本性的差異,使用者必須分清楚。

就 linux 作業系統的角度,完整的權限設定值是四位數字。第一位數,代表檔案或目錄的特殊屬

性。 4 代表 "suid"﹔2 代表 "sgid"﹔1 代表 "粘滯位元 - save text image"。後三位數,依

序代表 "user-檔案擁有者","group-群組","other-其他"。每一位數,代表三種權限的疊加,

4-讀(r),2-寫(w),1-執行(x)。被禁止的權限則以 0 帶入。

但對 umask 來說,有效的設定值只有後三位數。在 bash 中,雖然可帶入四位數字,但第一個數

字,必須為 0。這點請注意。

umask 指令中的 nnn 所代表的意義與 chmod 指令的 nnn 相似。不同的是 chmod 指令 nnn 是

“給於”使用或者是將要改變的許可權限,而 umask 則是“取消”nnn 的使用許可權限。這點是

根本性的差異,必須清楚。

指令 umask 的設定值以三個八進位的數字“nnn”代表。第一個設定數字給使用者自己(owner

user),第二個則是設定給用使用者所屬的群體(group),第三個給不屬於同群體的其它使用者

(other)。每一位數字的設定值都是三項不同權限的數值加總,read 權限數值為 4;write 權

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 329

umask

限數值為 2;execute 權限數值為 1。結合了前三者的權限數值,單一的數字可設定的範圍是 0 ~

7;整體的可設定範圍是 000 ~ 777。

umask 的設定值,對目錄,與對檔案的實質作用是有差別的。當我們設定為 000 時,會得到完全

開放的目錄權限 777,以及檔案權限 666。為何檔案只得到 666 呢?因為檔案權限中的 execute

權限已被程式移除,因此,不管你設定什麼 umask 數值,檔案都不會出現 execute 權限。

選項說明

bash

-S

以 "u=rwx,g=rx,o=rx" 這種較人性的格式取代數字顯示。

-p

當使用 -p 選項,但 mode 省略,輸出格式為 umask mode (可以做為下 umask 指令使用)。當模

式改變成功,或 mode 參數被省略,執行的狀態值為 0。否則狀態值為 1。

實例說明

bash

首先,讓我們先顯示目前環境的 umask 設定情況

# umask

0022

#

得到的數值為 "0022"。所以,建立新檔案的預設權限是 644,目錄則是 755。如果不習慣看數字,

我們可以使用 -S 選項來顯示設定值

# umask -S

u=rwx,g=rx,o=rx

#

實際建個檔案與目錄看看

# ls > fileA

# mkdir dirB

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 330

umask

# ls -l

總計 8

drwxr-xr-x 2 root root 4096 12 月 21 16:42 dirB

-rw-r--r-- 1 root root 6 12 月 21 16:42 fileA

#

一如預期,電腦沒壞...

tcsh

$ umask

22

$

$ umask 000

$ umask

0

$

從以上,我們可以知道,tcsh 簡單到連 0 都懶的顯示...或許該說,粗枝大葉吧。這篇點單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 331

uname

uname

指令語法

uname [OPTION]...

指令說明

未指定選項時,顯示的訊息格式與 -s 選項相同。

選項說明

-a, --all :顯示所有資訊

-m, --machine :顯示電腦硬體型別

-n, --nodename :顯示電腦的主機名稱(hostname)

-r, --release :顯示作業系統核心程式的發行版別

-s, --sysname :顯示作業系統名稱

-p, --processor :顯示主機的處理器型別

-v :顯示作業系統版本與時間資訊

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實務說明

# uname

Linux

# uname -a

Linux www 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown

#

知道有這麼一個指令就行了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 332

unhash

unhash

指令語法

tcsh

unhash

指令說明

指令的作用是關閉 internal hash table 功能的使用。

相關指令

hashstat, rehash

實例說明

[akira@www logs]$ unhash

簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 333

unix2dos

unix2dos

指令語法

unix2dos [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]

指令說明

聽名字,就能肯定是個"老芋頭"指令。在電腦硬體日新月異,微軟三不五時改名換版(賺新錢)的

情況下,這個 UNIX 時代的指令,如今還依然行不改名,坐不改姓地能存活在這個新的 Linux 年

代。

有時上網閒逛,爾偶會看到有人詢問文字檔中,每行結尾多了個 ^M....我腦裡

就浮現,年老的麥克阿瑟將軍面對著西點軍校的青年學子們做最後演說,麥帥

以一首滄傷的軍歌歌詞作演說的結尾:Old soldiers never die, They only fade

away (老兵不死,只是凋零) ...

DOS 的文字檔案,列的結束符號有二個字元,一個是歸位字元 (carriage return,^M),另一個

是換列字元 (new line,^J)。但 UNIX 只使用一個新列字元 \n (^J)。所以當 UNIX(BSD, Linux

也一樣) 的文字檔傳到 DOS 上用文字編輯器編輯時,會發現錯亂成首尾相連的一行。

因而有了這個指令,作用是將 Unix 的行尾符號(^J)轉換成 DOS 文字檔案裡的行尾符號(^M^J)。

選項說明

-h --help

顯示程式用法資訊。

-k --keepdate

轉檔保留原檔案的日期標示。

-q --quiet

安靜模式。不顯示任何訊息。

-c --convmode convmode

模擬 SunOS 下的 dos2unix 轉換模式。 支援的轉換模式有 ASCII, 7bit, ISO, Mac。

-o --oldfile file ...

原檔名模式。這個模式也是程式的預設模式。轉換結果覆寫到原檔名,所以不會產生新檔案。檔

名可使用萬用字元(Wildcard)。

-n --newfile infile outfile ...

新檔案模式。將轉換的結果存到指定的檔名。注意: infile 萬萬不可使用萬用字元(Wildcard)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 334

unix2dos

因為 outfile 無法相對支援,會造成部分檔案遺失的嚴重後果。

實例說明

如果代轉檔的檔案不多,指令也接受一個以上的檔名引數,並不麻煩。

# unix2dos man-at.txt man-ls.txt man-unix2dos.txt

unix2dos: converting file man-at.txt to DOS format ...

unix2dos: converting file man-ls.txt to DOS format ...

unix2dos: converting file man-unix2dos.txt to DOS format ...

#

其實上例因為檔名有個相關性,因此使用萬用字元 * 會更方便。

# unix2dos man*

unix2dos: converting file man-at.txt to DOS format ...

unix2dos: converting file man-ls.txt to DOS format ...

unix2dos: converting file man-unix2dos.txt to DOS format ...

#

如果你想保留原檔案,可以使用 -n 選項

# unix2dos -n man-at.txt dos-at.txt

unix2dos: converting file man-at.txt to file dos-at.txt in DOS format ...

#

這個 -n 選項,萬萬不可使用萬用字元,會造成檔案遺失。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 335

unlink

unlink

指令語法

unlink FILE

unlink OPTION

指令說明

從指令名稱來看很容易讓人聯想到 unlink 是 link 指令的對應功能。但事實卻不全然是如此,

link 只能做硬連結的檔案。但 unlink 指令使用系統呼叫 unlink() 函數,卻可以移除一般檔

案、連結檔案及符號連結的目錄。

所以,請別讓 unlink 這字面上的意義給誤導。此外還有特例,據 GNU 在她官方的文件中提到,

有某些系統上的 unlink 指令也可以順利移除一般目錄。但這並不是 GNU 版本的做法。

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

坦白說,農夫個人習慣使用 rm 來移除檔案或目錄。我個人感覺這個指令可以防止誤宰目錄,除

此之外,我實在想不起有什麼特別的理由,需要記這個指令。這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 336

vdir

vdir

指令語法

vdir [OPTION]... [FILE]...

指令說明

在 GNU 發行的 Core-utils 程式集中,ls.c 有三個 mode,其中使用 LS_LONG_FORMAT 的正是

vdir 指令。實際上 vdir 指令和 dir 指令相同均是 ls 指令的衍生指令。

對 vdir, dir 有慣用性的使用者,農夫個人建議,儘量調整成使用 ls。因為作業環境對 vdir, dir

指令的設定並不完備,如 dircolors 的系統環境預設就是最好的例子。多數都只對 ls 指令做設

定,而忽略的 vdir, dir。

選項說明

-a, --all

顯示所有檔案,包含特殊檔案(.file)

-A, --almost-all

顯示所有檔案,包含特殊檔案(.file),但隱藏 . .. 這兩個特殊檔案

--author

列出每個檔案的作者

-b, --escape

顯示跳脫字元(escapes)

--block-size=SIZE

自定 block size 的大小

-B, --ignore-backups

不顯示檔名結尾帶符號 "~" 的檔案或目錄(通常 vim 編輯時會自動產生的備用檔案就是會在原

檔名後附加上一個 ~ 符號)

-c

與 -l 選項搭配,會顯示檔案的最後更改時間(ctime),並以檔名排序。與 -lt 選項搭配時會顯

示 ctime 並以 ctime 排序。

-C

多列(columns)顯示,由上而下、由左而右排列。

--color[=WHEN]

顏色顯示設定。參數值有 never(不使用顏色), always(使用顏色), auto(當終端機為標準輸出裝

置時,使用顏色)。

-d, --directory

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 337

vdir

僅顯示目錄本身,不顯示目錄下的其他內容。

-D, --dired

以 Emacs 的目錄模式作為顯示格式。

-f

資料以磁碟的存儲順序列出,不另外做排序。啟用 -aU 選項,並取消 -lst 選項的功能。

-F, --classify

檔名後附上代表檔案類型的特殊符號。 * 表示檔案可執行; / 表示目錄; @ 表示符號鏈結;| 表

示 FIFOs; = 表示套接字 (sockets);一般檔案沒有附加符號。

--format=WORD

設定顯示格式。格式(WORD)有 across, horizontal, commas, verbose, single-column,

vertical。功能上 across 等於 -x, commas 等效 -m, horizontal 等效 -x, long 等效 -l,

single-column 等效 -1, verbose 等效 -l, vertical 等效 -C。

--full-time

與 -l --time-style=full-iso 等效。顯示完整的時間。

-g

與 -l 選項相似,但不顯示擁有者欄位。

-G, --no-group

不顯示群組名稱,需搭配 -l 選項使用。

-h, --human-readable

檔案大小以 k, M, G 顯示。選項須與 -l 或 -o 選項合用。

--si

與 -h 選項相似,但計算單位是 1000bytes 而不是 1024bytes。

--indicator-style=WORD

設定檔案類型標記,WORD 的預設值為 none,當設定為 classify 時,功能與 -F 選項相似。

-i, --inode

顯示檔案和目錄的 inode 索引數字。

-I, --ignore=PATTERN

不顯示符合指定的 PATTERN 檔案。

-k

等同 --block-size=1K 選項

-l

檔案資料以詳細格式顯示。欄位依序是 使用權限、硬連結數目、擁有者、群組名稱、大小、最後

修改時間、檔名

-L, --dereference

顯示符號連結目錄的檔案內容。

-m

以逗號(,)作區隔字元。

-n, --numeric-uid-gid

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 338

vdir

相似 -l 選項,但顯示 UIDs 與 GIDs 數字

-N, --literal

顯示檔案和目錄名稱,包括控制字元。

-o

相似 -l 選項,但不顯示檔案的群組資訊。

-p, --file-type

檔名後附上代表檔案類型的特殊符號。與 -F 選項相似,差別在對可執行檔案不附加 * 符號。

-q, --hide-control-chars

顯示時使用問號(?)代替取代非圖形字元。

--show-control-chars

顯示非圖形字元。

-Q, --quote-name

將顯示的檔名用括號("")括起來。

--quoting-style=WORD

將符合指定 WORD 型態的檔名顯示時以括號括起來。WORD 有 literal, locale, shell,

shell-always, c, escape 等。

-r, --reverse

顯示檔名以降羃排序處理。

-R, --recursive

顯示"子目錄"的檔案資料。

-s, --size

顯示檔案所佔用的 blocks 大小

-S

以檔案的大小排序

--sort=WORD

設定排序型態。可指定的型態以及顯示的選項等效如後,extension -X, none -U, size -S, time

-t, version -v, status -c, time -t, atime -u, access -u, use -u

--time=WORD

自訂時間型態資料,取代原本的異動時間顯示。WORD 型態有 atime, access, use, ctime, status

--time-style=STYLE

自訂顯示時間格式,STYLE 有 full-iso, long-iso, iso, locale, +FORMAT

-t

以檔案的異動時間排序

-T COLS, --tabsize=COLS

設定跳格的寬度(預設值 8)

-u

與 -lt 選項搭配時,顯示"最後存取時間",並以她來排序;與 -l 選項搭配時,顯示"最後存取

時間",以檔名排序;其他使用,以"最後存取時間"排序

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 339

vdir

-U

不排序,顯示先後以目錄檔(.)紀錄的次序為依據

-v

以"版本"排序

-w COLS, --width=COLS

自訂螢幕顯示行的長度(COLS 預設值來自終端機的環境設定,其次則來自環境變數 COLUMNS,如

果沒有相關設定,預設值將為 80)

-x

資料顯示次序是,由行左至行右,再由上而下。

-X

以"副檔名"(extension)的字母次序排序。

-1

單列顯示

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

捲到這裡,累了嗎?你可以休息一下。你真的可以休息一下。請半天假,看場電影再回來。

指令現存的選項裡,有一部分相似甚至是重疊的,其實交談環境下只要掌握自己想的知道的資訊,

認識該用的選項,大概就可以了。看倌們,就青菜蘿蔔,各取所好吧。

實例說明

指令原則上與 ls 指令相同。請參考 ls 指令。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 340

vimtutor

vimtutor

指令語法

vimtutor [language]

指令說明

對 vim 陌生的使用者,可以藉由 vimtutor 來做練習。vimtutor 所進入的 vim 是 vi 相容模式。

相關檔案

/usr/share/vim/vim61/tutor/tutor[.language]

Vimtutor 指令執行需要的語言文字檔,中文繁體的檔名為 tutor.zh.big5

/usr/share/vim/vim61/tutor/tutor.vim

The Vim script used to copy the Vimtutor text file.

實例說明

目前的 RedHat 9.0 支援中文繁體,語言代碼是 zh

# vimtutor zh

你進入的 vim 後會看到以下的檔案內容,跟著文件的說明與指示玩....如果你有時間的話...

===============================================================================

= 歡 迎 閱 讀 《 V I M 教 程 》 ―― 版本 1.5 =

===============================================================================

vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅,在本教程當中

就詳細介紹了。本教程的設計目標是講述一些必要的基本命令,而掌握好這些

命令,您就能夠很容易將 vim 當作一個通用的萬能編輯器來使用了。

完成本教程的內容大約需要 25-30 分鐘,取決于您訓練的時間。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 341

vimtutor

每一節的命令操作將會更改本文。推薦您復制本文的一個副本,然後在副本上

進行訓練(如果您是通過"vimtutor"來起動教程的,那麼本文就已經是副本了)。

切記一點︰本教程的設計思路是在使用中進行學習的。也就是說,您需要通過

執行命令來學習他們本身的正確用法。如果您只是閱讀而不操作,那麼您可能

會很快遺忘這些命令的!

好了,現在請確定您的 Shift-Lock(大小寫鎖定鍵)還沒有按下,然後按鍵盤上

的字母鍵 j 足夠多的次數來移動光標,直到第一節的內容能夠完全充滿屏幕。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一講第一節︰移動光標

※※ 要移動光標,請依照說明分別按下 h、j、k、l 鍵。 ※※

^

k 提示︰ h 的鍵位于左邊,每次按下就會向左移動。

< h l > l 的鍵位于右邊,每次按下就會向右移動。

j j 鍵看起來很象一支尖端方向朝下的箭頭。

v

1. 請隨意在屏幕內移動光標,直至您覺得舒服為止。

2. 按下下行鍵(j),直到出現光標重復下行。

---> 現在您應該已經學會如何移動到下一講吧。

3. 現在請使用下行鍵,將光標移動到第二講。

提示︰如果您不敢確定您所按下的字母,請按下鍵回到正常(Normal)模式。

然後再次從鍵盤輸入您想要的命令。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 342

vimtutor

提示︰光標鍵應當也能正常工作的。但是使用 hjkl 鍵,在習慣之後您就能夠快速

地在屏幕內四處移動光標了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一講第二節︰VIM 的進入和退出

!! 特別提示︰敬請閱讀完整本一節的內容,然後才能執行以下所講解的命令。

1. 請按鍵(這是為了確保您處在正常模式)。

2. 然後輸入︰ :q!

---> 這種方式的退出編輯器絕不會保存您進入編輯器以來所做的改動。

如果您想保存更改再退出,請輸入︰

:wq

3. 如果您看到了命令行提示符,請輸入能夠帶您回到本教程的命令,那就是︰

通常情況下您也可以用這種方式︰

vim tutor

---> 這裡的 'vim' 表示進入 vim 編輯器,而 'tutor'則是您準備要編輯的文件。

4. 如果您自信已經牢牢記住了這些步驟的話,請從步驟 1執行到步驟 3退出,然

後再次進入編輯器。接著將光標移動到第一講第三節來繼續我們的教程講解。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一講第三節︰文本編輯之刪除

** 在正常(Normal)模式下,可以按下 x 鍵來刪除光標所在位置的字符。**

1. 請將光標移動到本節中下面標記有 ---> 的那一行。

vimtutor

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 343

vimtutor

2. 為了修正輸入錯誤,請將光標移至準備刪除的字符的位置處。

3. 然後按下 x 鍵將錯誤字符刪除掉。

4. 重復步驟 2到步驟 4,直到句子修正為止。

---> The ccow jumpedd ovverr thhe mooon.

5. 好了,該行已經修正了,下一節內容是第一講第四節。

特別提示︰在您瀏覽本教程時,不要強行記憶。記住一點︰在使用中學習。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一講第四節︰文本編輯之插入

** 在正常模式下,可以按下 i 鍵來插入文本。**

1. 請將光標移動到本節中下面標記有 ---> 的第一行。

2. 為了使得第一行內容雷同于第二行,請將光標移至文本第一個字符準備插入的位置。

3. 然後按下 i 鍵,接著輸入必要的文本字符。

4. 所有文本都修正完畢,請按下 鍵返回正常模式。

重復步驟 2至步驟 4以便修正句子。

---> There is text misng this .

---> There is some text missing from this line.

5. 如果您對文本插入操作已經很滿意,請接著閱讀下面的小結。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一講小結

1. 光標在屏幕文本中的移動既可以用箭頭鍵,也可以使用 hjkl 字母鍵。

h (左移) j (下行) k (上行) l (右移)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 344

vimtutor

2. 欲進入 vim 編輯器(從命令行提示符),請輸入︰vim 文件名

3. 欲退出 vim 編輯器,請輸入以下命令放棄所有修改︰

:q!

或者輸入以下命令保存所有修改︰

:wq

4. 在正常模式下刪除光標所在位置的字符,請按︰ x

5. 在正常模式下要在光標所在位置開始插入文本,請按︰

i 輸入必要文本

特別提示︰按下 鍵會帶您回到正常模式或者取消一個不期望或者部分完成的命令。

好了,第一講到此結束。下面接下來繼續第二講的內容。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講第一節︰刪除類命令

** 輸入 dw 可以從光標處刪除至一個單字/單詞的末尾。**

1. 請按下 鍵確保您處于正常模式。

2. 請將光標移動到本節中下面標記有 ---> 的那一行。

3. 請將光標移至準備要刪除的單詞的開始。

4. 接著輸入 dw 刪除掉該單詞。

特別提示︰您所輸入的 dw 會在您輸入的同時出現在屏幕的最後一行。如果您輸

入有誤,請按下 鍵取消,然後重新再來。

---> There are a some words fun that don't belong paper in this sentence.

5. 重復步驟 3至步驟 4,直至句子修正完畢。接著繼續第二講第二節內容。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 345

vimtutor

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講第二節︰其他刪除類命令

** 輸入 d$ 從當前光標刪除到行末。**

1. 請按下 鍵確保您處于正常模式。

2. 請將光標移動到本節中下面標記有 ---> 的那一行。

3. 請將光標移動到該行的尾部(也就是在第一個點號‘.’後面)。

4. 然後輸入 d$ 從光標處刪至當前行尾部。

---> Somebody typed the end of this line twice. end of this line twice.

5. 請繼續學習第二講第三節就知道是怎麼回事了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講第三節︰關于命令和對象

刪除命令 d 的格式如下︰

[number] d object 或者 d [number] object

其意如下︰

number - 代表執行命令的次數(可選項,缺省設置為 1 )。

d - 代表刪除。

一個簡短的對象列表︰

w - 從當前光標當前位置直到單字/單詞末尾,包括空格。

e - 從當前光標當前位置直到單字/單詞末尾,但是 *不* 包括空格。

$ - 從當前光標當前位置直到當前行末。

object - 代表命令所要操作的對象(下面有相關介紹)。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 346

vimtutor

特別提示︰

對于勇于探索者,請在正常模式下面僅按代表相應對象的鍵而不使用命令,則

將看到光標的移動正如上面的對象列表所代表的一樣。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講第四節︰對象命令的特殊情況

** 輸入 dd 可以刪除整一個當前行。 **

鑒于整行刪除的高頻度,VIM 的設計者決定要簡化整行刪除,僅需要在同一行上

擊打兩次 d 就可以刪除掉光標所在的整行了。

1. 請將光標移動到本節中下面的短句段落中的第二行。

2. 輸入 dd 刪除該行。

3. 然後移動到第四行。

4. 接著輸入 2dd (還記得前面講過的 number-command-object 嗎?) 刪除兩行。

1) Roses are red,

2) Mud is fun,

3) Violets are blue,

4) I have a car,

5) Clocks tell time,

6) Sugar is sweet

7) And so are you.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講第五節︰撤消類命令

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 347

vimtutor

** 輸入 u 來撤消最後執行的命令,輸入 U 來修正整行。**

1. 請將光標移動到本節中下面標記有 ---> 的那一行,並將其置于第一個錯誤處。

2. 輸入 x 刪除第一個不想保留的字母。

3. 然後輸入 u 撤消最後執行的(一次)命令。

4. 這次要使用 x 修正本行的所有錯誤。

5. 現在輸入一個大寫的 U ,恢復到該行的原始狀態。

6. 接著多次輸入 u 以撤消 U 以及更前的命令。

7. 然後多次輸入 CTRL-R (先按下 CTRL 鍵不放開,接著輸入 R 鍵) ,這樣就可以執行恢復

命令,也就是撤消掉撤消命令。

---> Fiix the errors oon thhis line and reeplace them witth undo.

8. 這些都是非常有用的命令。下面是第二講的小結了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第二講小結

1. 欲從當前光標刪除至單字/單詞末尾,請輸入︰dw

2. 欲從當前光標刪除至當前行末尾,請輸入︰d$

3. 欲刪除整行,請輸入︰dd

4. 在正常模式下一個命令的格式是︰

[number] command object 或者 command [number] object

其意是︰

number - 代表的是命令執行的次數

command - 代表要做的事情,比如 d 代表刪除

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 348

vimtutor

object - 代表要操作的對象,比如 w 代表單字/單詞,$ 代表到行末等等。

$ (to the end of line), etc.

5. 欲撤消以前的操作,請輸入︰u (小寫的 u)

欲撤消在一行中所做的改動,請輸入︰U (大寫的 U)

欲撤消以前的撤消命令,恢復以前的操作結果,請輸入︰CTRL-R

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三講第一節︰置入類命令

** 輸入 p 將最後一次刪除的內容置入光標之後 **

1. 請將光標移動到本節中下面示范段落的首行。

2. 輸入 dd 將該行刪除,這樣會將該行保存到 vim 的緩沖區中。

4. 然後在正常模式下(鍵進入),輸入 p 將該行粘貼置入。

5. 重復步驟 2至步驟 4,將所有的行依序放置到正確的位置上。

d) Can you learn too?

b) Violets are blue,

c) Intelligence is learned,

a) Roses are red,

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三講第二節︰替換類命令

** 輸入 r 和一個字符替換光標所在位置的字符。**

3. 接著將光標移動到準備置入的位置的上方。記住︰是上方哦。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 349

vimtutor

1. 請將光標移動到本節中下面標記有 ---> 的第一行。

2. 請移動光標到第一個錯誤的適當位置。

3. 接著輸入 r ,這樣就能將錯誤替換掉了。

4. 重復步驟 2和步驟 3,知道第一行是已經修改完畢。

---> Whan this lime was tuoed in, someone presswd some wrojg keys!

---> When this line was typed in, someone pressed some wrong keys!

5. 然後我們繼續學校第三講第三節。

特別提示︰切記您要在使用中學習,而不是在記憶中學習。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三講第三節︰更改類命令

** 要改變一個單字/單詞的部分或者全部,請輸入 cw **

1. 請將光標移動到本節中下面標記有 ---> 的第一行。

2. 接著把光標放在單詞 lubw 的字母 u 的位置那裡。

3. 然後輸入 cw 就可以修正該單詞了(在本例這裡是輸入 ine 。)

4. 最後按 鍵,然後光標定位到下一個錯誤第一個準備更改的字母處。

5. 重復步驟 3和步驟 4,知道第一個句子完全雷同第二個句子。

---> This lubw has a few wptfd that mrrf changing usf the change command.

---> This line has a few words that need changing using the change command.

提示︰請注意 cw 命令不僅僅是替換了一個單詞,也讓您進入文本插入狀態了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三講第四節︰使用 c指令的其他更改類命令

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 350

vimtutor

** 更改類指令可以使用同刪除類命令所使用的對象參數。**

1. 更改類指令的工作方式跟刪除類命令是一致的。操作格式是︰

[number] c object 或者 c [number] object

2. 對象參數也是一樣的,比如 w 代表單字/單詞,$代表行末等等。

3. 請將光標移動到本節中下面標記有 ---> 的第一行。

4. 接著將光標移動到第一個錯誤處。

5. 然後輸入 c$ 使得該行剩下的部分更正得同第二行一樣。最後按 鍵。

---> The end of this line needs some help to make it like the second.

---> The end of this line needs to be corrected using the c$ command.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三講小結

1. 要重新置入已經刪除的文本內容,請輸入小寫字母 p。該操作可以將已刪除

的文本內容置于光標之後。如果最後一次刪除的是一個整行,那麼該行將置

于當前光標所在行的下一行。

2. 要替換光標所在位置的字符,請輸入小寫的 r 和要替換掉原位置字符的新字符即可。

3. 更改類命令允許您改變指定的對象,從當前光標所在位置直到對象的末尾。

比如輸入 cw 可以替換當前光標到單詞的末尾的內容;輸入 c$ 可以替換當

前光標到行末的內容。

4. 更改類命令的格式是︰

[number] c object 或者 c [number] object

下面我們繼續學習下一講。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 351

vimtutor

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第四講第一節︰定位及文件狀態

** 輸入 CTRL-g 顯示當前編輯文件中當前光標所在行位置以及文件狀態信息。

輸入 SHIFT-G 則直接跳轉到文件中的某一指定行。**

提示︰切記要先通讀本節內容,之後才可以執行以下步驟!!!

1. 按下 CTRL 鍵不放開然後按 g 鍵。然後就會看到頁面最底部出現一個狀態信

息行,顯示的內容是當前編輯的文件名和文件的總行數。請記住步驟 3的行號。

2. 按下 SHIFT-G 鍵可以使得當前光標直接跳轉到文件最後一行。

3. 輸入您曾停留的行號,然後按下 SHIFT-G。這樣就可以返回到您第一次按下

CTRL-g 時所在的行好了。注意︰輸入行號時,行號是不會在屏幕上顯示出來的。

4. 如果願意,您可以繼續執行步驟 1至步驟三。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第四講第二節︰搜索類命令

** 輸入 / 以及尾隨的字符串可以用以在當前文件中查找該字符串。**

1. 在正常模式下輸入 / 字符。您此時會注意到該字符和光標都會出現在屏幕底

部,這跟 : 命令是一樣的。

2. 接著輸入 errroor 。那個 errroor 就是您要查找的字符串。

3. 要查找同上一次的字符串,只需要按 n 鍵。要向相反方向查找同上一次的字

符串,請輸入 Shift-N 即可。

4. 如果您想逆向查找字符串,請使用 ? 代替 / 進行。

---> When the search reaches the end of the file it will continue at the start.

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 352

vimtutor

"errroor" is not the way to spell error; errroor is an error.

提示︰如果查找已經到達文件末尾,查找會自動從文件頭部繼續查找。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第四講第三節︰配對括號的查找

** 按 % 可以查找配對的括號 )、]、}。**

1. 把光標放在本節下面標記有 --> 那一行中的任何一個 (、[ 或 { 處。

2. 接著按 % 字符。

3. 此時光標的位置應當是在配對的括號處。

4. 再次按 % 就可以跳回配對的第一個括號處。

---> This ( is a test line with ('s, ['s ] and {'s } in it. ))

提示︰在程序調試時,這個功能用來查找不配對的括號是很有用的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第四講第四節︰修正錯誤的方法之一

** 輸入 :s/old/new/g 可以替換 old 為 new。**

1. 請將光標移動到本節中下面標記有 ---> 的那一行。

2. 輸入 :s/thee/the 。請注意該命令只改變光標所在行的第一個匹配串。

3. 輸入 :s/thee/the/g 則是替換全行的匹配串。

---> the best time to see thee flowers is in thee spring.

4. 要替換兩行之間出現的每個匹配串,請輸入 :#,#s/old/new/g (#,#代表的是

兩行的行號)。輸入 :%s/old/new/g 則是替換整個文件中的每個匹配串。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 353

vimtutor

第四講小結

1. Ctrl-g 用于顯示當前光標所在位置和文件狀態信息。Shift-G 用于將光標跳

轉至文件最後一行。先敲入一個行號然後按 Shift-G 則是將光標移動至該行

號代表的行。

2. 輸入 / 然後緊隨一個字符串是則是在當前所編輯的文檔中向後查找該字符串。

輸入問號 ? 然後緊隨一個字符串是則是在當前所編輯的文檔中向前查找該字

符串。完成一次查找之後按 n 鍵則是重復上一次的命令,可在同一方向上查

找下一個字符串所在;或者按 Shift-N 向相反方向查找下該字符串所在。

3. 如果光標當前位置是括號(、)、[、]、{、},按 % 可以將光標移動到配對的

括號上。

4. 在一行內替換頭一個字符串 old 為新的字符串 new,請輸入 :s/old/new

在一行內替換所有的字符串 old 為新的字符串 new,請輸入 :s/old/new/g

在文件內替換所有的字符串 old 為新的字符串 new,請輸入 :%s/old/new/g

進行全文替換時詢問用戶確認每個替換需添加 c 選項,請輸入 :%s/old/new/gc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五講第一節︰在 VIM 內執行外部命令的方法

** 輸入 :! 然後緊隨著輸入一個外部命令可以執行該外部命令。**

1. 按下我們所熟悉的 : 命令設置光標到屏幕底部。這樣就可以讓您輸入命令了。

2. 接著輸入感嘆號 ! 這個字符,這樣就允許您執行外部的 shell 命令了。

3. 我們以 ls 命令為例。輸入 !ls 。該命令就會列舉出您當前目錄的

在兩行內替換所有的字符串 old 為新的字符串 new,請輸入 :#,#s/old/new/g

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 354

vimtutor

內容,就如同您在命令行提示符下輸入 ls 命令的結果一樣。如果 !ls 沒起

作用,您可以試試 :!dir 看看。

---> 提示︰ 所有的外部命令都可以以這種方式執行。

---> 提示︰ 所有的 : 命令都必須以 告終。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五講第二節︰關于保存文件的更多信息

** 要將對文件的改動保存到文件中,請輸入 :w FILENAME **

1. 輸入 :!dir 或者 :!ls 獲知當前目錄的內容。您應當已知道最後還得敲吧。

2. 選擇一個尚未存在文件名,比如 TEST 。

4. 該命令會以 TEST 為文件名保存整個文件 (VIM 教程)。為了確保正確保存,

請再次輸入 :!dir 查看您的目錄列表內容。

---> 請注意︰如果您退出 VIM 然後在以文件名 TEST 為參數進入,那麼該文件內

容應該同您保存時的文件內容是完全一樣的。

5. 現在您可以通過輸入 :!rm TEST 來刪除 TEST 文件了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五講第三節︰一個具有選擇性的保存命令

** 要保存文件的部分內容,請輸入 :#,# w FILENAME **

1. 再來執行一次 :!dir 或者 :!ls 獲知當前目錄的內容,然後選擇一個合適的

不重名的文件名,比如 TEST 。

2. 接著將光標移動至本頁的最頂端,然後按 CTRL-g 找到該行的行號。別忘了行號哦。

3. 接著輸入 :w TEST (此處 TEST 是您所選擇的文件名。)

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 355

vimtutor

3. 接著把光標移動至本頁的最底端,再按一次 CTRL-g 。也別忘了這個行好哦。

4. 為了只保存文章的某個部分,請輸入 :#,# w TEST 。這裡的 #,# 就是上面

要求您記住的行號(頂端行號,底端行號),而 TEST 就是選定的文件名。

5. 最後,用 :!dir 確認文件是否正確保存。但是這次先別刪除掉。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五講第四節︰提取和合並文件

1. 請鍵入 :!dir 確認您前面創建的 TEST 文件還在。

2. 然後將光標移動至當前頁面的頂端。

3. 接著通過 :r TEST 將前面創建的名為 TEST 的文件提取進來。

特別提示︰您所提取進來的文件將從光標所在位置處開始置入。

4. 為了確認文件已經提取成功,移動光標回到原來的位置就可以注意有兩份第

五講第三節,一份是原本,另外一份是來自文件的副本。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五講小結

1. :!command 用于執行一個外部命令 command。

請看一些實際例子︰

:!dir - 用于顯示當前目錄的內容。

:!rm FILENAME - 用于刪除名為 FILENAME 的文件。

2. :w FILENAME 可將當前 VIM 中正在編輯的文件保存到名為 FILENAME 的文件中。

** 要向當前文件中插入另外的文件的內容,請輸入 :r FILENAME **

特別提示︰ 執行步驟 3之後您將看到第五講第三節,請屆時再往下移動回到這裡來。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 356

vimtutor

3. :#,#w FILENAME 可將當前編輯文件第 # 行至第 # 行的內容保存到文件 FILENAME 中。

4. :r FILENAME 可提取磁盤文件 FILENAME 並將其插入到當前文件的光標位置後面。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六講第一節︰打開類命令

** 輸入 o 將在光標的下方打開新的一行並進入插入模式。**

1. 請將光標移動到本節中下面標記有 ---> 的那一行。

2. 接著輸入小寫的 o 在光標 *下方* 打開新的一行並進入插入模式。

3. 然後復制標記有 ---> 的行並按 鍵退出插入模式而進入正常模式。

---> After typing o the cursor is placed on the open line in Insert mode.

4. 為了在光標 *上方* 打開新的一行,只需要輸入大寫的 O 而不是小寫的 o

就可以了。請在下行測試一下吧。當光標處在在該行上時,按 Shift-O 可以

在該行上方新開一行。

Open up a line above this by typing Shift-O while the cursor is on this line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六講第二節︰光標後插入類命令

** 輸入 a 將可在光標之後插入文本。 **

1. 請在正常模式下通過輸入 $ 將光標移動到本節中下面標記有 ---> 的第一行的末尾。

2. 接著輸入小寫的 a 則可在光標之後插入文本了。大寫的 A 則可以直接在行

末插入文本。

提示︰輸入大寫 A 的操作方法可以在行末插入文本,避免了輸入 i,光標定位到

最後一個字符,輸入的文本, 回復正常模式,箭頭右鍵移動光標以及

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 357

vimtutor

x 刪除當前光標所在位置字符等等諸多繁雜的操作。

3. 操作之後第一行就可以補充完整了。請注意光標後插入文本與插入模式是基

本完全一致的,只是文本插入的位置定位稍有不同罷了。

---> This line will allow you to practice

---> This line will allow you to practice appending text to the end of a line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六講第三節︰另外一個置換類命令的版本

** 輸入大寫的 R 可連續替換多個字符。**

1. 請將光標移動到本節中下面標記有 ---> 的第一行。

2. 移動光標到第一行中不同于標有 ---> 的第二行的第一個單詞的開始,即單

詞 last 處。

3. 然後輸入大寫的 R 開始把第一行中的不同于第二行的剩余字符逐一輸入,就

可以全部替換掉原有的字符而使得第一行完全雷同第二行了。

---> To make the first line the same as the last on this page use the keys.

---> To make the first line the same as the second, type R and the new text.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六講第四節︰設置類命令的選項

** 設置可使查找或者替換可忽略大小寫的選項 **

1. 要查找單詞 ignore 可在正常模式下輸入 /ignore 。要重復查找該詞,可以

重復按 n 鍵。

4. 請注意︰如果您按 退出置換模式回復正常模式,尚未替換的文本將仍然保持原狀。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 358

vimtutor

2. 然後設置 ic 選項(ic 就是英文忽略大小寫 Ignore Case 的首字母縮寫詞),即

輸入︰

:set ic

3. 現在可以通過鍵入 n 鍵再次查找單詞 ignore。重復查找可以重復鍵入 n 鍵。

4. 然後設置 hlsearch 和 incsearch 這兩個選項,輸入以下內容︰

:set hls is

5. 現在可以再次輸入查找命令,看看會有什麼效果︰

/ignore

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六講小結

1. 輸入小寫的 o 可以在光標下方打開新的一行並將光標置于新開的行首,進入

插入模式。

輸入大寫的 O 可以在光標上方打開新的一行並將光標置于新開的行首,進入

插入模式。

2. 輸入小寫的 a 可以在光標所在位置之後插入文本。

輸入大寫的 A 可以在光標所在行的行末之後插入文本。

3. 輸入大寫的 R 將進入替換模式,直至按 鍵退出替換模式而進入正常

模式。

4. 輸入 :set xxx 可以設置 xxx 選項。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 359

vimtutor

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第七講︰在線幫助命令

** 使用在線幫助系統 **

Vim 擁有一個細致全面的在線幫助系統。要啟動該幫助系統,請選擇如下三種方

法之一︰

- 按下 鍵 (如果鍵盤上有的話)

- 按下 鍵 (如果鍵盤上有的話)

- 輸入 :help

輸入 :q 可以關閉幫助窗口。

提供一個正確的參數給":help"命令,您可以找到關于該主題的幫助。請試驗以

下參數(可別忘了按回車鍵哦。:)︰

:help w

:help c_

:help insert-index

:help user-manual

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 360

vimtutor

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第八講︰創建一個啟動腳本

** 啟用 vim 的功能 **

Vim 的功能特性要比 vi 多得多,但大部分功能都沒有缺省激活。為了啟動更多的

功能,您得創建一個 vimrc 文件。

1. 開始編輯 vimrc 文件,這取決于您所使用的操作系統︰

:edit ~/.vimrc 這是 Unix 系統所使用的命令

:edit $VIM/_vimrc 這是 Windows 系統所使用的命令

2. 接著導入 vimrc 范例文件︰

:read $VIMRUNTIME/vimrc_example.vim

3. 保存文件,命令為︰

:write

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 361

vimtutor

在下次您啟動 vim 的時候,編輯器就會有了語法高亮的功能。您可以繼續把您喜

歡的其它功能設置添加到這個 vimrc 文件中。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

vim 教程到此結束。本教程只是為了簡明地介紹一下 vim 編輯器,但已足以讓您

很容易學會使用本編輯器了。毋庸質疑,vim 還有很多很多的命令,本教程所介

紹的還差得遠著呢。所以您要精通的話,還望繼續努力哦。下一步您可以閱讀

vim 手冊,使用的命令是︰

:help user-manual

為了更進一步的參考和學習,以下這本書值得推薦︰

Vim - Vi Improved - 作者︰Steve Oualline

出版社︰New Riders

這是第一本完全講解 vim 的書籍。對于初學者特別有用。其中還包含有大量實例

和圖示。欲知詳情,請訪問 http://iccf-holland.org/click5.html

以下這本書比較老了而且內容主要是 vi 而不是 vim,但是也值得推薦︰

Learning the Vi Editor - 作者︰Linda Lamb

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 362

vimtutor

出版社︰O'Reilly & Associates Inc.

這是一本不錯的書,通過它您幾乎能夠了解到全部 vi 能夠做到的事情。此書的第

六個版本也包含了一些關于 vim 的信息。

本教程是由來自 Calorado School of Minese 的 Michael C. Pierce、Robert K.

Ware 所編寫的,其中來自 Colorado State University 的 Charles Smith 提供了

很多創意。編者通信地址是︰

[email protected]

本教程已由 Bram Moolenaar 專為 vim 進行修訂。

譯制者附言︰

===========

簡體中文教程翻譯版之譯制者為梁昌泰 ,還有

另外一個聯系地址︰[email protected]

繁體中文教程是從簡體中文教程翻譯版使用 Debian GNU/Linux 中文項目小

組的于廣輝先生編寫的中文漢字轉碼器 autoconvert 轉換而成的,並對轉

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 363

vimtutor

換的結果做了一些細節的改動。

變更記錄︰

=========

2002 年 03 月 18 日 梁昌泰

根據 Bram Molenaar 先生在 2002 年 03 月 16 日的來信要求,將 vimtutor1.4 中譯

版升級到 vimtutor1.5。

2001 年 11 月 15 日 梁昌泰

將 vimtutor1.4 中譯版提交給 Bram Molenaar 和 Sven Guckes。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

這篇簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 364

w

w

指令語法

w - [husfV] [user]

指令說明

對一個支援多人多工的系統而言,要獲得系統的執行狀態的方法不少,指令 w 就是其中相當常用

的一種。它主要的功能在於顯示使用者登錄狀態與系統運作的程序現況。

指令基本顯示的資訊有兩行表頭,第一行與系統的運作資訊有關,顯示資訊的順序為下:

目前時間;系統已運作時間;目前上線的使用者統計;系統平均負載:1分鐘,5分鐘,15 分鐘

第二行表頭以及其下的資訊對應如下:

使用者名稱;終端機編號;從那台機器登錄;登錄時間;停滯時間;JCPU;PCPU;執行的程序名

JCPU 代表該終端機所有執行程序所佔用的 CPU time 總和。它包含目前還在執行的背景工作,但

對已執行完畢的背景工作所佔用的 CPU time 則不列入總計。

PCPU 代表目前執行程序(WHAT 欄位)佔用的 CPU time。

選項說明

-h :不顯示第一行系統資訊與第二行資訊行頭

-u :對 w, w -u, su 等執行程序的 cpu 耗費計算,忽略使用者(userid)的關

係。

-s :精簡顯示。不顯示登錄時間, JCPU 以及 PCPU 這三項資訊。

-f :不顯示從那台機器登錄的訊息

-V :顯示程式本身的版本資訊

實例說明

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 365

w

以下範例顯示,由於幾經格式轉換,在欄位對齊上可能已失去原有的正確性,請以自己電腦上的

操作為準。

# w

6:42pm up 25 days, 1:01, 3 users, load average: 0.97, 0.51, 0.22

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

rooB pts/0 - 12:10pm 6:31m 0.00s ? -

rooB pts/1 - 5:47pm 44.00s 1:31 0.30s grotty

rooB pts/2 - 6:42pm 0.00s 0.11s 0.03s w

# w -h

rooB pts/0 - 12:10pm 6:31m 0.00s ? -

rooB pts/1 - 5:47pm 47.00s 1:34 0.30s grotty

rooB pts/2 - 6:42pm 0.00s 0.11s 0.03s w -h

# w -u

6:42pm up 25 days, 1:01, 3 users, load average: 0.97, 0.53, 0.23

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

rooB pts/0 - 12:10pm 6:31m 0.00s ? -

rooB pts/1 - 5:47pm 49.00s 1:37 0.02s man tcsh

rooB pts/2 - 6:42pm 0.00s 0.12s 0.03s w -u

# w -s

6:42pm up 25 days, 1:01, 3 users, load average: 0.97, 0.53, 0.23

USER TTY FROM IDLE WHAT

rooB pts/0 - 6:32m -

rooB pts/1 - 51.00s grotty

rooB pts/2 - 0.00s w -s

# w -f

6:42pm up 25 days, 1:02, 3 users, load average: 0.97, 0.54, 0.23

USER TTY LOGIN@ IDLE JCPU PCPU WHAT

rooB pts/0 12:10pm 6:32m 0.00s ? -

rooB pts/1 5:47pm 54.00s 1:41 0.30s grotty

rooB pts/2 6:42pm 0.00s 0.13s 0.04s w -f

這個簡單的指令,所顯示簡短的系統資訊,實際上,能讓對使用者或管理者迅速地掌握系統的部

分狀態。重點也就是看的人必須理解訊息的內容,能否切確地掌握與判斷這些資訊,對進一步的

分析有很大的幫助。當然這需要一段時間的自我學習。這篇就簡單地到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 366

w

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 367

wait

wait

指令語法

bash

wait [n]

tcsh

wait

指令說明

通常我們可以使用 wait 指令來等待先前所執行的背景工作,等她們的程序與子程序處理完畢的

狀態值回傳。這個內建指令在 bash 與 tcsh 中,其基本的作用是相同的。

在 bash 中還可以指定特定的程序 ID。如果沒有指定程序 ID,則以等待當前的所以程序及子程

序結束為 0 的狀態值。當指定的程序 ID 已經不存在時,結束的狀態值為 127。簡單到此。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 368

wall

wall

指令語法

wall [ message ]

指令說明

一般使用者可以藉 wall 指令廣播訊息給所有登錄的終端機用戶。傳送訊息的長度限制是 20

行。廣播訊息中的發送時間是系統的當地時間。

當 tty 的 mesg 設定為 no 時,一般使用者的訊息會被拒收,但 root 的訊息則不受此限制。

實務說明

通常,臨時或簡單的訊息,可以直接刮在雙引號中,直接廣播

# wall "Hi everyone, Follow me. I'm going to take a leak."

如果,訊息有現成的文字檔,也可以將之導入 wall 中使用

# wall < messages-file

當然,長度限制是 20 行為限。急!走先。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 369

wc

wc

指令語法

wc [OPTION]... [FILE]...

指令說明

顯示指定文件的 行,字(word) 與 位元(byte)的數目總計。如未指定文件或指定的檔案名為"-"

符號時,指令將改為計算標準輸入的資料。

選項說明

-c, --bytes :顯示位元數統計

-m, --chars :顯示字母數統計

-l, --lines :顯示行數統計

-L, --max-line-length :顯示檔案裡最長該行的長度資訊

-w, --words :顯示單字數(word)統計

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

如未指定任何選項,指令會依序輸出 行, 字, 位元 的統計資訊。

實例說明

# ls exp-*

exp-01 exp-02 exp-03

# wc exp-*

9 5 44 exp-01

338 212 2156 exp-02

1478 7364 52037 exp-03

1825 7581 54237 總計

# wc -L exp-*

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 370

wc

32 exp-01

23 exp-02

89 exp-03

89 總計

這個指令有一點要注意的是,他的輸出格式的先後次序是固定不變的,

# wc -lw exp*

9 5 exp-01

338 212 exp-02

1478 7364 exp-03

1825 7581 總計

# wc -wl exp*

9 5 exp-01

338 212 exp-02

1478 7364 exp-03

1825 7581 總計

由於指令本身不支援欄位說明的顯示,所以在選項組合時,很難辨識。但他顯示的先後次序永遠

都是"行數"、"字數"、"位元數"、然後才是"最長長度"

wc 指令目前也支援對中文檔案的計算。但有兩個地方會出問題

1. 關於"字 - word"的計算,英文單字與單字間以 space 字元區隔,此點為程

式計算字數的依據,但中文通常是緊連在一起沒有空格的,所以程式所設計的

計算方式不適用於中文。

2. 中文是形意字,沒有字母。一個中文字的長度相當於兩個英文字母的長度,

所以 -m 選項也不適用。

這篇就簡單地到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 371

whatis

whatis

指令語法

whatis keyword ...

指令說明

使用關鍵字查詢 man 的檢索資料庫,將完全符合條件的資料輸出。(RedHat 7.3 的檢索資料庫是

/usr/sbin/makewhatis 的 bash script 所產生的)

相關指令

apropos(1), man(1)

實例說明

# whatis who

who (1) - show who is logged on

#

只有完全符合指定的關鍵字的內容,才會顯示。如果想要作模糊比對的話,可以改用 來

apropos

# apropos who

at.allow [at] (5) - determine who can submit jobs via at or batch

at.deny [at] (5) - determine who can submit jobs via at or batch

fwhois [whois] (1) - query a whois or nicname database

w (1) - Show who is logged on and what they are doing

who (1) - show who is logged on

whoami (1) - print effective userid

whois (1) - query a whois or nicname database

whom (1) - report to whom a message would go

#

這篇,就簡單地寫到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 372

whereis

whereis

指令語法

whereis [ -bmsu ] [ -BMS directory... -f ] filename ...

指令說明

whereis 能非常有效率地找到有關指令的二進碼程式,原始碼檔案或線上說明文件等檔案明確的

存放位置。如果還在使用 find 來做這類的事情,強烈建議改用這個指令。你會發現 whereis 的

效率十分驚人。當然她之所以快,是因為只搜尋設定的固定目錄的關係。

指令搜尋的路徑如下

二進碼程式的搜尋目錄

"/bin",

"/sbin",

"/etc",

"/lib",

"/usr/{bin, sbin, etc, lib, games, contrib, hosts,

include, ucb, old, new,

local, libexec, share}"

"/usr/games/{bin, lib}",

"/usr/emacs/etc",

"/usr/lib/emacs/*/etc",

"/usr/TeX/bin",

"/usr/tex/bin",

"/usr/interviews/bin/LINUX",

"/usr/X11R6/bin",

"/usr/X386/bin",

"/usr/bin/X11",

"/usr/X11/bin",

"/usr/X11R5/bin",

"/usr/local/{bin, sbin, etc, lib, games}",

"/usr/local/games/bin",

"/usr/local/emacs/etc",

"/usr/local/TeX/bin",

"/usr/local/tex/bin",

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 373

whereis

"/usr/local/bin/X11",

"/usr/g++-include",

"/opt/*/bin",

原始碼檔案的搜尋目錄

"/usr/src/*",

"/usr/src/lib/libc/*",

"/usr/src/lib/libc/net/*",

"/usr/src/ucb/pascal",

"/usr/src/ucb/pascal/utilities",

"/usr/src/undoc",

線上說明文件的搜尋目錄

"/usr/man/*",

"/usr/share/man/*",

"/usr/X386/man/*",

"/usr/X11/man/*",

"/usr/TeX/man/*",

"/usr/interviews/man/mann",

以上路徑取自僅供參考,真實的搜尋路徑隨各作業系統的編譯情況而定。

選項說明>

-b 只搜尋二進碼程式

-m 只搜尋線上說明文件

-s 只搜尋原始碼

-u 列出不符合指令下達的搜尋型態的輸入對象。

-B 對指定的目錄進行二進位程式的搜尋

-M 對指定的目錄進行線上說明文件的搜尋

-S 對指定的目錄進行原始碼的搜尋

-f 去除檔案的目錄路徑,只列出檔名。這個選項是使用 -B, -M, 或 -S 選項時,必須配合使

用的。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 374

whereis

實務說明

# whereis man

man: /usr/bin/man /etc/man.config /usr/local/man /usr/share/man

/usr/share/man/man1/man.1.gz /usr/share/man/man7/man.7.gz

#

以上是一般的使用。如果我們只需要顯示與 man(1) 有關的線上說明文件時,可以使用 -m 加

上 -M 選項來限定搜尋的路徑

# whereis -m -M /usr/share/man/man1 -f man

man: /usr/share/man/man1/man.1.gz

#

這樣顯示的結果只會列出 /usr/share/man/man1 底下的資料,其他的目錄就不做搜尋了。

# ls

col kill man more nice whereis

# whereis -s *

col:

kill:

man:

more:

nice:

whereis:

# whereis -s -S /root/Source-code/ -f *

col: /root/Source-code//col.c

kill: /root/Source-code//kill.c

man:

more: /root/Source-code//more.c

nice: /root/Source-code//nice.c

whereis: /root/Source-code//whereis.c

# whereis -u -s -S /root/Source-code/ -f *

man:

#

這篇就到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 375

whereis

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 376

who

who

指令語法

who [OPTION]... [ FILE | ARG1 ARG2 ]

選項說明

-H, --heading 顯示欄位說明(第一行)

-i, -u, --idle 顯示閒滯置使用時間(格式為"時:分"或 old;當閒滯時間超過 24 小時,就

會以 old 來顯示)

-l, --lookup 嘗試轉換 hostname 位址到相對應的 DNS 網域名稱顯示

-m 只顯示 hostname 以及 user

-q, --count 顯示所有登錄的使用者名稱,並顯示數量總和

-T, -w, --mesg 在原有的格式中,增加一個關於是否接收訊息的狀態欄位。

狀態值以 +, -, ? 這三個符號表示

"+" 表示允許執行 write 指令;並接受其他使用者傳送

訊息

"-" 表示不允許執行 write 指令;也不接收其他使用者

傳送的訊息

"?" 則表示已無法找到該終端機

--message 與 -T 選項相同

--writable 與 -T 選項相同

--help 顯示程式用法資訊

--version 顯示程式本身的版本資訊

實例說明

指令 who 能最簡單迅速地顯示使用者簽入系統的現況的指令。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 377

who

# who -H -T

USER MESG LINE LOGIN-TIME FROM

root + pts/0 Oct 15 01:55

root - pts/1 Oct 15 10:04

root - pts/2 Oct 15 02:57

root + pts/3 Oct 16 00:34

.....

他也提供簡單的簽入者數量的計算,選項是 -q 或 --count

# who -q

root root root root

# users=4

說他是統計"使用者",嚴格說來並不恰當。說他是統計系統的 tty 或許比較貼切些。

有時系統管理者也可以藉由他來得知一些沒有 login 的帳戶,方法就是加上 -i 查看使用者終端

機的 idle 狀態。

除此之外,使用者也可以使用 who 來得知自己目前所在的 hostname 以及簽入系統的

username、tty nubmer 與簽入的時間等資訊。

# who -m

www!root pts/1 Oct 15 10:04

# who am i

www!root pts/1 Oct 15 10:04

鍵入"who am i"的作用相當於 -m 選項。如果想獲得關於 messages 的設定資訊,可以加上選項 -T

# who -mTH

USER MESG LINE LOGIN-TIME FROM

www!root - pts/1 Oct 15 10:04

這篇就簡單地到這裡。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 378

whoami

whoami

指令語法

whoami [OPTION]...

指令說明

萬一當你在多次的 su 中迷失了自己,這個指令可以告訴你目前實際使用的 user id -- 你是誰。

選項說明

--help :顯示程式用法資訊

--version :顯示程式本身的版本資訊

實例說明

對著電腦問如此經典的哲學問題......這個畫面...我想,還是您自己來吧。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 379

write

write

指令語法

write user [ttyname]

指令說明

如果想與系統中的某使用者發行私人訊息,這個指令是不錯的選擇。你可以使用 write 指令將訊

息傳送給特定的使用者或終端機。

基本上,write 必須在 設定為 yes 的狀態下,才可以使用。因為 mesg 控制著是否使

用與接收訊息。使用前必須留意此點。

mesg 指令

一般的使用者,想要使用 write 來發送訊息給某位使用者時,如果對方設定不接收訊息,指令會

自動回應錯誤訊息。但如果是 root,則不受此條件的限制。也就是說 root 有特權,一般使用者

一定得接收 root 所發送的訊息。

查看某使用者是否在已登錄到系統中,以及 tty 編號的情況,可以使用 。 指令 who

實例說明

那一天,管理者跳蚤阿張,午飯後的不久仍舊是昏昏欲睡...痴呆在螢幕前...腦袋裡打轉著兩個

字.."振作"....轉了半天..."振作"碰上了"聊天",於是,跳蚤阿張的手指直覺地在鍵盤上打了一個

指令

# who -TH

USER MESG LINE LOGIN-TIME FROM

akira + tty4 Oct 17 13:21

root + pts/0 Oct 17 12:53

root - pts/1 Oct 17 12:54

root - pts/2 Oct 17 13:06

挖! 只有 akira 這個蠢蛋...算了...有總比沒有好..

# write akira tty4

write: you have write permission turned off.

噁! 忘了打開權限....什麼鳥電腦.#%$#@#

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 380

write

# mesg

is n

# mesg y

# write akira tty4

....

沒多久...他們就跑去喝下午茶了....

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 381

yes

yes

指令語法

yes [STRING]...

yes OPTION

指令說明

不斷輸出指定字串或`y'

選項說明

--help

顯示程式用法資訊

--version

顯示程式本身的版本資訊

實例說明

# yes

y

y

y

y (以下省略)

在 Enter 後,螢幕會馬上被不斷出現的 y 所充滿。這就是本指令的功能(坦白說,我覺得這個指

令蠻無聊的)。看煩了,可以按 Ctrl + c 中斷指令輸出。當然,輸出字串是可以自己指定,像我

喜歡聽 500 塊的歌,我就有權利叫電腦一直掉 500$ 出來

# yes 500$

500$

500$

500$

500$

500$ (使用 Ctrl + c 終止執行)

它會一直掉到偶(爽的)受不了為止。這篇就到這裡了。

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 382

版本修正與堪誤

網路農夫 ( w w w . e u r o p a . i d v . t w )•自由文件 – GNU/Linux 基礎指令集 - 383

版本修正與堪誤

0.04 改正 sum 中的錯字。 0.03 統一 dir, ls, vdir 中的 atime, ctime, mtime 譯名。 0.02 修正 crontab 範例筆誤。 0.01