前言
本文假定讀者沒用過或僅短暫用過 Unix 命令列環境,說明 FreeBSD 命令列環境的基本使用方式。
登入系統
若讀者按照站長先前的文章安裝了 FreeBSD,這時候還沒有桌面環境可用。如果讀者是在 VPS (虛擬專用伺服器) 上使用 FreeBSD,通常也不會有桌面環境可用。未使用登入管理員 (display manager 或 login manager) 時,會進入命令列的登入提示。
系統跑完開機流程後,會出現以下登入提示 (login prompt):
login:
如果想以一般使用者來使用系統,輸入該使用者的帳號 (username),然後輸入該使用者的密碼 (password)。為了安全起見,輸入密碼時,不會出現提示文字:
login: user
Password:
請讀者根據實際的使用者帳號來代替此處的 user 。
如果想以系統管理員來管理系統,輸入 root
,然後輸入 root
的密碼。同樣地,輸入密碼時,不會出現提示文字:
login: root
Password:
由於 Unix 的系統管理員帳號固定為 root
,而且該帳號有最高權限。為了系統安全,會儘量減少使用 root
,像是在 SSH 遠端登入禁用 root
。
成功登入系統後,會進入命令列提示,等待使用者輸入指令。在 Unix 慣例中,一般使用者的提示符號是 $
:
$
root
的提示符號是 #
,這是為了和一般使用者區別:
#
本系列文章按照 Unix 的慣例,一般使用者的指令會使用 $
為提示符號,root
的指令則使用 #
。
第一次輸入指令
此處開始練習使用命令列的方式。請輸入 pwd
指令。這個指令會秀出當前的工作目錄 (working directory)。輸入指令的方式是以鍵盤逐一輸入 p
、w
、d
三個字母後,按 Enter 鍵:
$ pwd
/home/user
該使用者為 user ,故其家目錄為 /home/user 。每個一般使用者在 /home 目錄下會有自己獨立的子目錄,而 root
的家目錄則為 /root 。
不一定每種 Unix 的使用者家目錄皆位於 /home 。先前的 FreeBSD 的使用者家目錄位於 /usr/home ,macOS 的則位於 /Users 。
指令執行完畢後,系統會把使用權返還給使用者,繼續等待下一個指令:
$
現在輸入 ls
指令。同樣地,以鍵盤逐一輸入 l
、s
後,按 Enter 鍵:
$ ls
剛安裝完的 FreeBSD 的使用者家目錄下是空的。所以不會秀出任何資料。這和 Windows 的 dir
指令相異。
再重新輸入一次 ls
指令,這次加上參數 -a
,會顯示常規檔案和隱藏檔案:
$ ls -a
. .cshrc .login_conf .mailrc .shrc
.. .login .mail_aliases .profile
這些隱藏檔案是使用者設定檔。Unix 不使用登錄檔 (registry) 來設定系統,而是用文字檔案 (text file) 來設定系統,不論是使用者設定檔或是系統設定檔皆如此。
使用參數會改變指令的行為,就不需要為相似的功能寫另一個指令。
離開 Shell 環境
輸入 exit
指令可離開系統:
$ exit
該使用者離開系統後,系統會重回登入提示,等待使用者登入:
login:
將系統關機
我們還沒有安裝桌面環境,在命令列中,以 root
輸入以下指令即可將系統關機:
# shutdown -p now
站長還沒說明將一般使用者提升成 root
的方式,目前的做法是先登出一般使用者後重新以 root
登入。我們會在後續文章介紹提升使用者權限的方式。
Unix 上常見的 Shell
Unix 的命令列環境其實是一種叫做 shell (殼) 的程式。先前我們未強調當前的命令列為何種 shell,直接使用系統預設的 shell。其實 Unix 上有多種 shell,使用者可自行替換 shell。
以下列出 Unix 上常見的 shell:
sh
系列sh
(POSIX Shell)bash
(Bourne Again Shell)ksh
(Korn Shell)zsh
(Z shell)
csh
系列csh
(C Shell)tcsh
(TENEX C Shell)
- 其他
fish
在這些 shell 中,最常用的是 Bash。注重互動性的可以試試看 Z shell。C shell 現在較少使用,多見於 BSD 系統,包括 FreeBSD。
平常使用的 shell 和撰寫 shell 命令稿的 shell 可使用相異的 shell,所以不需要為了學 Bash 程式設計而不敢嘗試其他 shell。
更換 Shell 環境
本節展示更換 shell 的方式。操作不慎的話會無法登入系統,請小心地操作。
使用以下指令秀出目前使用的 shell:
$ echo $SHELL
/bin/sh
SHELL
是內建的環境變數 (environment variable),用來代表目前系統的 shell。
很多 GNU/Linux 上的 sh
其實是指向 Bash 的連結,直接使用即可。但 FreeBSD 的 sh
並非 Bash,而是 POSIX shell。比起 Bash,POSIX shell 在功能上比較侷限,所以我們會把 shell 換成 Bash。
用 which(1)
指令檢查 bash(1)
的路徑:
$ which bash
但系統上並未安裝 Bash,所以這時不會顯示任何文字。FreeBSD 採取比較精簡的策略,不會在一開始就安裝很多不必要的套件,使用者有需要時再自行安裝。
切到 root
,安裝 Bash:
# pkg install bash
站長會在後續文章談到在 FreeBSD 安裝套件的方式,這裡先照著輸入指令即可。
再度檢查 bash
的路徑:
$ which bash
/usr/local/bin/bash
注意此處 bash
的路徑和 GNU/Linux 差異較大。在 GNU/Linux 中,Bash 的路徑多位於 /bin/bash 或 /usr/bin/bash 。碰到新的系統時要小心檢查,不能直接照搬過去的經驗。
使用 chsh(1)
指令更換使用者的 shell:
$ chsh -s /usr/local/bin/bash
Password:
chsh: user information updated
登出系統後再重新登入,可以發現 shell 已經換過來了:
$ echo $SHELL
/usr/local/bin/bash
取得幫助文件
命令列工具 (指令) 有許多的參數來調整其行為。學會有效率地自主查詢指令的系統手冊也是一項資訊能力。
部分指令的 -h
參數會顯示可用參數。像是以下指令可查詢 man(1)
的參數:
$ man -h
Usage:
man [-adho] [-t | -w] [-M manpath] [-P pager] [-S mansect]
[-m arch[:machine]] [-p [eprtv]] [mansect] page [...]
man -f page [...] -- Emulates whatis(1)
man -k page [...] -- Emulates apropos(1)
但大部分 BSD 指令不支援長參數,所以 GNU/Linux 上常見的 --help
參數是無效的:
$ man --help
Illegal option --
部分指令的 -h
參數並非顯示可用參數。像是 ls(1)
的 -h
參數會搭配 -l
參數,用易讀的 (human-readable) 方式顯示檔案大小:
$ ls -l -h
除了在命令列環境看可用參數,Unix 的 man
指令可用來閱讀本地端系統手冊。以下範例指令用來閱讀 awk(1)
的手冊:
$ man awk
awk
是一個小型程式語言,但現階段不需要知道 awk
如何使用,這只是一個指令的實例。
輸入 man
後,會進入該指令的互動式環境:
AWK(1) FreeBSD General Commands Manual AWK(1)
NAME
awk – pattern-directed scanning and processing language
SYNOPSIS
awk [-safe] [-version] [-d[n]] [-F fs] [-v var=value]
[prog | -f progfile] file ...
DESCRIPTION
awk scans each input file for lines that match any of a set of patterns
specified literally in prog or in one or more files specified as -f
progfile. With each pattern there can be an associated action that will
be performed when a line of a file matches the pattern. Each line is
matched against the pattern portion of every pattern-action statement;
the associated action is performed for each matched pattern. The file
name ‘-’ means the standard input. Any file of the form var=value is
treated as an assignment, not a filename, and is executed at the time it
would have been opened if it were a filename.
The options are as follows:
(省略一些內容)
實際上該互動式環境由 less(1)
指令提供。以下是 less
的基本使用方式:
j
:向下捲動一行k
:向上捲動一行f
:向下捲動一頁b
:向上捲動一頁q
:離開man
的互動模式/
+ 文字:搜尋特定文字。搜到的部分會反白- ESC +
u
:消除反白文字
BSD 系統的手冊會附帶範例,而 GNU/Linux 的不會。附帶一提,macOS 是以 BSD 為基底,所以 macOS 的系統手冊也會有範例。承上,以下是 awk
的部分範例:
(在 awk(1) 的手冊中)
EXAMPLES
Print lines longer than 72 characters:
length($0) > 72
Print first two fields in opposite order:
{ print $2, $1 }
Same, with input fields separated by comma and/or blanks and tabs:
BEGIN { FS = ",[ \t]*|[ \t]+" }
{ print $2, $1 }
Add up first column, print sum and average:
{ s += $1 }
END { print "sum is", s, " average is", s/NR }
(省略一些內容)
甚至 man
本身也有手冊可閱讀,所以下列指令是正確的:
$ man man
至於 man
的系統手冊的內容就留給讀者自己去閱讀了。
但系統手冊是以指引 (reference) 的風格來撰寫,直接拿來自學指令會比較辛苦。初學 Unix 的讀者可以到 TLDR 學習常見指令的基本用法。熟悉指令後再讀系統手冊就不會那麼吃力。
TLDR 是網路用語,全文為「Too Long; Didn't Read」,代表原始資訊過長,不值得花時間閱讀。所以 TLDR 網站將指令的基本用法整理出來,Unix 學習者就不用再辛苦地讀系統手冊。