FreeBSD帶有許多簡單而功能強大的命令以使你的計算機工作更容易。不管你對任何Unix系統有多少經驗,都會發現有效完成工作的新捷徑和新方法。
在這篇文章中,我們將討論命令以幫你記住你是誰,你在哪兒,如何找東西以及如何像Unix鬼精靈一樣地思考問題和完成任務!
我喜歡虛擬終端的概念,而且通常我都運行所有8個終端以及XWindows會話。通常,我會運行一個PPP會話、一個打開郵件客戶端的終端、幾個不同的打開手冊頁所占的終端、以root身份運行命令的終端以及以普通用戶身份運行命令的終端。當然功能越強帶來的混亂越多。我會用一些命令來幫我解決混亂。
如果我忘了把手冊頁開在哪個終端上的話,PrintScrn鍵會以升序依次滾動列出所有虛擬終端。如果沒有運行X Window會話,可以永遠繼續重復1到8號終端。否則,它會在9號終端上停下來,也就是X服務器。
如果我進入了一個終端並希望知道這是哪個終端的話,可以用tty命令:
tty
/dev/ttyv4
注意,這實際上是5號虛擬終端,因為這些終端是從0開始排列的。如果離開了該終端,就可以用Alt-F5返回。
如果我想知道在該終端上的是哪個用戶,可以用whoami:
whoami
root
如果我想知道有誰登錄進了終端,可以用who:
who
genisis ttyv0 Jun 3 15:45
genisis ttyv1 Jun 3 15:46
genisis ttyv2 Jun 3 21:09
genisis ttyv3 Jun 3 21:10
genisis ttyv4 Jun 3 21:27
genisis ttyv5 Jun 4 09:40
genisis ttyv6 Jun 4 09:43
genisis ttyv7 Jun 4 10:46
注意who和whoami之間的區別。在ttyv4,我本來是以genisis身份登錄的,然後再成為超級用戶。who命令告訴你誰擁有登錄命令解釋器而不返回非登錄解釋器的信息。也就是說,因為我的X Window會話不是一個登錄解釋器,ttyv8就不會顯示在輸出信息中。
如果我忘了自己在哪個目錄中,可以用pwd:
pwd
它會顯示我當前所在的工作目錄:
/usr/home/genisis
好的經驗是:不要在還沒有用pwd查看一下你實際所處的位置之前就創建或刪除文件。
現在,如果我忘了時間信息:
date
Sun Jun 4 11:15:46 EDT 2000
或者更糟的話,忘了今天的日期:
cal
June 2000
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
或者需要知道2020年的聖誕節時哪一天:
cal 12 2020
December 2020
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
或者簽署獨立宣言那一周的日程:
cal 07 1776
July 1776
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
最後兩個關於cal的小技巧同樣可以使你的朋友很吃驚;試一下這個:
cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
空缺的日期是由於恺撒歷到陽歷的切換。還有:
ncal -e
April 23 2000
這會顯示耶稣降臨日;用-o就可以知道東正教日歷。
到此,你可能會想我一定是個非常出色的打字員。讓我們看一下命令歷史列表:
h
110 date > /usr/home/genisis/cal
111 cal > /usr/home/genisis/cal
112 cal 12 2020 > /usr/home/genisis/cal
113 cal 07 1776 > /usr/home/genisis/cal
117 cal 9 1752 > /usr/home/genisis/cal
122 ncal -e > /usr/home/genisis/cal
134 h > /usr/home/genisis/cal
我很討厭打字,而且還用了這麼多重定向符>。如果你要保存命令行上的結果到一個文件中就要用這個重定向符;它的語法總是一樣的:
command > filename
因為我要你看到以上歷史列表中每個命令的輸出,所以把它們重定向到了一個文件中。然後再貼到我的文檔裡來。注意我覆蓋了七次同樣的文件;因為我只用了一個重定向符。
讓我們假定你已經向FreeBSD問答列表中發出一個問題,這時就會有人要你提供uname -a,dmesg和fstab的輸出內容。你就可以用>創建三個文件然後把它們貼到你的電子郵件文檔中。但是你也可以把所有三個輸出重定向到一個文件,只要用>>這個重定向符替換即可:
uname -a > /usr/home/genisis/help
dmesg >> /usr/home/genisis/help
more /etc/fstab >> /usr/home/genisis/help
如果我現在輸入:
more /usr/home/genisis/help,
就會看到以上三個文件的輸出了。
讓我們更仔細地看一下這些命令:
在uname -a命令中我只用了一個>,因為我正在創建一個新文件,不會覆蓋它本身的內容。
因為我在dmesg命令中用了>>,就不會覆蓋那個文件中uname -a的那部分了。
注意,我需要為/etc/fstab使用更多的命令。如果我用:
fstab >> /usr/home/genisis/help,
fstab: Command not found:
將會出現錯誤信息。你不能重定向文件;你只能對命令輸出進行重定向。在這種情況下,讀/etc/fstab的命令就是more了;讀取的結果就會被重定向到/usr/home/genisis/help。
這樣你已經成功地發送了三個命令到一個文件中,而不會覆蓋每個命令的輸出。但為什麼要打上三個命令呢?完全可以有一種方法用一個命令就完成這些工作。如果我打:
uname -a dmesg more /etc/fstab >> /usr/home/genisis/help2,
usage: uname [-amnrsv]
我就會收到這樣的信息。再看一下這個命令;它的確有你要做的每件事兒,但你能說出倒底哪個是命令,哪個是開關,哪個是文件呢?如果你對此感到因惑的話,想象一下你的命令解釋器在試圖解釋你的意圖時會感覺怎樣。所以我們需要一些分隔命令的方法;試一下這個:
uname -a; dmesg; more /etc/fstab >> /usr/home/genisis/help3
這會使uname -a和dmesg的輸出送到終端上;如果你用這個命令:
more /usr/home/genisis/help3
你只會看到more /etc/fstab命令的輸出。
所以,我們已經有點接近了。我們已經分隔了這些命令,現在要讓命令解釋器知道我們想要的是三個輸出都送到那個文件中,而不是最後那個命令的輸出。最後再試一下這個:
(uname -a; dmesg; more /etc/fstab) >> /usr/home/genisis/help4
more /usr/home/genisis/help4
你就會得到想要的結果了。上面的圓括號告訴命令解釋器,你想先運行括號裡的命令,然後再把它們所有的輸出重定向到那個文件中。
FreeBSD還有幾個好用的工具用於查找信息。使用哪個工具就取決於你要找什麼。如果你要找應用程序的話,可以用whereis:
whereis ls
ls: /bin/ls
如果你要找一個文件的話,可以用locate:
locate fstab
/etc/fstab
如果你要找些東西但不知道它是什麼的話,可以用whatis:
whatis ls
ls(1) - list directory contents
whatis fstab
fstab(5) - static information about the filesystems
注意whatis這個命令會在括號中包含手冊頁的號碼。如果你要上面兩樣東西的附加信息的話,可以用:
man 1 ls
man 5 fstab
但你是否需要找一段指定的文本呢?就需要用grep工具了,它有一套很簡單的語法:
grep whatyou'relookingfor filename
讓我們假設我記不清在FreeBSD 4.0的缺省內核裡是否允許了bpf這個設備。雖然我可以打開這個文件開始閱讀,但更快的辦法是:
grep bpf /usr/src/sys/i386/conf/GENERIC
# The `bpf' pseudo-device enables the Berkeley Packet Filter.
pseudo-device bpf #Berkeley packet filter
如果你記不清bpf選項所在的行號是多少,可以向grep裡加一個開關:
grep -n bpf /usr/src/sys/i386/conf/GENERIC
212:# The `bpf' pseudo-device enables the Berkeley Packet Filter.
214:pseudo-device bpf #Berkeley packet filter
這樣就可以列出相應的行號了。
當然,我也可以把這些輸出重定向到一個文件裡,把它寄給向我要的人。
grep -n bpf /usr/src/sys/i386/conf/GENERIC > /usr/home/genisis/reply
看另一個例子,如果你想取得計算機的CPU信息,可以運行dmesg,打開你的scroll lock按鈕,往上翻屏,查找描述CPU的那些行。或者你可以用:
dmesg | grep CPU
CPU: AMD-K6tm w/ multimedia extensions
(199.96-MHz 586-class CPU)
這樣會更快地取得同樣的信息。注意,如果你這樣用那個命令:
grep CPU dmesg
grep: dmesg: No such file or directory)
就會得到錯誤信息了。dmesg是一個命令,而你只能對文件進行grep。但是你可以用管道把輸出信息送到grep,這樣你就可以打到特定的信息了。
現在總結一下:當你使用grep時,問一下自己要找的東西是在文件裡還是命令結果。如果在文件裡,用:
grep text filename
如果是命令結果,用:
command | grep text
如果你有興趣學習其它基本命令,這裡有一份非常好的在線初學者教程,Introduction to Unix。