位元詩人 [FreeBSD] 系統使用教學:使用命令列環境

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

本文假定讀者沒用過或僅短暫用過 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)。輸入指令的方式是以鍵盤逐一輸入 pwd 三個字母後,按 Enter 鍵:

$ pwd
/home/user

該使用者為 user ,故其家目錄為 /home/user 。每個一般使用者在 /home 目錄下會有自己獨立的子目錄,而 root 的家目錄則為 /root

不一定每種 Unix 的使用者家目錄皆位於 /home 。先前的 FreeBSD 的使用者家目錄位於 /usr/home ,macOS 的則位於 /Users

指令執行完畢後,系統會把使用權返還給使用者,繼續等待下一個指令:

$

現在輸入 ls 指令。同樣地,以鍵盤逐一輸入 ls 後,按 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 學習者就不用再辛苦地讀系統手冊。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。