跳轉到內容

Ict-創新/LPI/103.1

來自 Wikibooks,開放書籍,開放世界

103.1 命令列工作

[編輯 | 編輯原始碼]

考生應該能夠使用命令列與 Shell 和命令互動。目標假設使用 bash Shell。


關鍵知識領域

  • 使用單個 Shell 命令和單行命令序列在命令列上執行基本任務。
  • 使用和修改 Shell 環境,包括定義、引用和匯出環境變數。
  • 使用和編輯命令歷史。
  • 在定義的路徑內外呼叫命令。

與計算機系統互動的基本方法是使用命令列。Shell 解釋在鍵盤上輸入的指令。Shell 提示符(以 $ 或 # 結尾,表示使用者 root)表示它已準備好接收使用者輸入。

Shell 也是一個程式設計環境,可用於執行自動化任務。Shell 程式被稱為指令碼。

最常用的 Shell
Bourne Shell /bin/sh
Bourne Again Shell /bin/bash
Korn Shell /bin/ksh
C Shell /bin/csh
Tom's C Shell /bin/tcsh

由於 bash Shell 是 Linux 世界中最廣泛使用的 Shell 之一,因此 LPI 主要集中在這個 Shell 上。

互動式 Shell

[編輯 | 編輯原始碼]

Shell 命令通常採用以下形式

command [options] {arguments}.

bash Shell 使用 echo 命令將文字列印到螢幕上。

$ echo “this is a short line”


完整路徑/相對路徑

Shell 將命令列上給出的任何字串的第一個“單詞”解釋為一個命令。如果字串是可執行檔案的完整路徑或相對路徑,則啟動可執行檔案。如果第一個單詞沒有“/”字元,則 Shell 將掃描 PATH 變數中定義的目錄,並嘗試執行與該字串匹配的第一個命令。

例如,如果 PATH 變數只包含目錄 /bin/usr/bin,則命令 xeyes 將找不到,因為它儲存在 /usr/X11R6/bin/xeyes 中,因此需要使用完整路徑

$ /usr/X11R6/bin/xeyes

另一種方法是使用相對路徑來輸入可執行檔案的完整路徑。例如,如果使用者在儲存 xeyes 程式的目錄中,則可以輸入

$ ./xeyes

上面的命令中的“.”表示當前工作目錄。由於您已在當前目錄中,因此該命令也可以簡單地寫成:(只有當“.”在您的搜尋路徑中時)

$ xeyes

Shell 變數

[編輯 | 編輯原始碼]

Shell 變數類似於任何計算語言中使用的變數。變數名僅限於字母數字字元。例如 CREDIT=300 只是將值 300 分配給名為 CREDIT 的變數。

1. 初始化變數 Variable-Name=value(沒有空格!!)
2. 引用變數 $Variable-Name


CREDIT=300

echo $CREDIT

可以使用 unset 命令刪除變數的值。


匯出、設定和 Env

變數有兩種型別:區域性變數和匯出變數。

區域性變數僅對當前 Shell 可訪問。另一方面,匯出變數可供 Shell 和從該 Shell 啟動的任何子程序訪問。

setenv 命令用於列出定義的變數

set 和 env 命令
set 列出所有變數
env 列出所有匯出變數

全域性變數在任何子程序都可以引用它的意義上是全域性的。下面的示例匯出變數 credit,然後檢查它是否按預期匯出。

export CREDIT

env | grep CREDIT


常見預定義變數列表

預定義變數
含義
DISPLAY X 用於識別在哪裡執行客戶端應用程式
HISTFILE 使用者 .bash_history 檔案的路徑
HOME 使用者主目錄的路徑
LOGNAME 使用者用來登入的名稱
PATH Shell 在輸入命令時搜尋程式的目錄列表,這些命令沒有路徑。
PWD 當前工作目錄
SHELL 使用的 Shell(大多數 Linux 發行版中的 bash)
TERM 當前終端模擬


特殊變數

接下來的幾個變數與程序管理相關。

$! 代表最後一個子程序的 PID 值

$$ 代表正在執行的 Shell 的 PID

$? 如果上一個命令成功執行則為 0,否則為非零值


元字元和引號

元字元是 Shell 中具有特殊含義的字元。它們主要用於檔案通配,即使用最少的字母來匹配多個檔案或目錄名稱。輸入 (<)、輸出 (>) 和管道 (|) 字元也是特殊字元,以及用於變數的美元 ($) 符號。我們不會在此列出它們,但請注意,這些字元很少用於命名普通檔案。

萬用字元

[編輯 | 編輯原始碼]
  • * 萬用字元可以替換任意數量的字元。

$ ls /usr/bin/b*

列出所有以 'b' 開頭的程式

  • ? 萬用字元可以替換任何一個字元。

$ ls /usr/bin/?b*

列出所有第二個字母為 'b' 的程式

  • [ ] 用於定義一個值的範圍。

$ ls a[0-9]

$ ls [!Aa]*

第一行列出所有以 'a' 開頭並在第二位有一個數字的檔案。

第二行列出所有不以 'a' 或 'A' 開頭的檔案

  • {string1,string2} 雖然不是檔案命名萬用字元,但它可以用來生成具有共同詞幹的名稱列表。

$ mkdir {mon, tues, wednes} day

引號和轉義程式碼

元字元的特殊含義可以透過跳脫字元來取消,跳脫字元也是元字元。

反斜槓 (\) 稱為跳脫字元,它取消了緊隨其後的字元的含義,迫使 Shell 按字面意思解釋它。

單引號 (' ') 取消除反斜槓以外的所有元字元的含義。

雙引號 (" ") 是最弱的引號,但會取消大多數包含字元的特殊含義,除了管道 (|)、反斜槓 (\) 和變數 ($var)。


反引號

反引號 `` 將執行封閉的命令並將其輸出替換回命令列。下面的示例使用 date 命令定義變數 TIME。

$ TIME="Today's date is `date +%a:%d:%b`”

echo $TIME

Today's date is Sun:15:Jul

另一種執行命令的方法(類似於反引號)是使用 $()。這將執行封閉的命令並將其視為變數。

$ TIME=$(date)

命令歷史

[編輯 | 編輯原始碼]

要檢視先前輸入命令的列表,可以使用 bash 內建命令 history。

$ history

  1. ls
  2. grep 500 /etc/passwd

這列出了所有快取的命令,以及儲存在 ~/.bash_history 中的命令。當用戶退出 Shell 時,快取的命令將儲存到 ~/.bash_history

您可以使用鍵盤上的向上箭頭和向下箭頭來回憶命令。還有 emacs 鍵繫結,使您能夠執行甚至編輯這些行。

Emacs 鍵繫結用於編輯命令歷史
Ctrl+P 上一行(與向上箭頭相同)
Ctrl+n 下一行(與向下箭頭相同)
Ctrl+b 在行上向後退一個字元(與左箭頭相同)
Ctrl+f 在行上向前移動一個字元(與右箭頭相同)
Ctrl+a 移至行首(與<Home>相同)
Ctrl+e 移至行尾(與<End>相同)

感嘆號 (!) 鍵可用於重新執行命令。

示例

x 執行歷史記錄列表中以 'x' 開頭的最新命令 2 執行歷史記錄輸出中的命令編號 2 -2 執行倒數第二個命令 ! 執行最後一個命令

^string1^string2 執行上一個命令並將 string1 替換為 string2


其他命令

別名

您可以為需要多個引數的命令建立別名。建立別名的格式為

$ alias myprog='command [options]{arguments}'

在命令列中僅鍵入 alias,您將獲得當前定義的別名列表。

命令補全

Tab鍵,shell 將完成您開始鍵入的命令。

複合命令
command1; command2; command3 三個命令將依次執行,無論前一個命令是否成功
command1 && command2 && command3 每個命令只有在先前的退出程式碼為 0(成功)時才會執行
command1 || command2 || command3 下一個命令只有在先前的退出程式碼不為 0(失敗)時才會執行


exec 命令

此命令不是二進位制檔案,而是 shell 的一部分。它用於啟動其他命令。通常,如果執行一個命令,就會啟動一個子程序。如果使用 exec 命令啟動新程式,它將重新佔用用於啟動它的程序。它會替換當前 shell(在指令碼或互動式 shell 中)。

當新命令終止時,控制不會傳遞迴呼叫 shell,而是返回到呼叫用於執行 exec 呼叫的 shell 的程序。

$ echo $$

414


$ bash

$ echo $$

455


$ echo hello

hello

$ echo $$

455


$ exec echo hello

hello

$ echo $$

414

上面的示例顯示了在直接的 echo 和使用 exec 的第一個 shell(程序 414)之後,控制返回到第二個 shell(程序 455)。

手冊頁和 whatis 資料庫

[edit | edit source]
手冊頁按特定主題組織
NAME 專案的名稱,後跟簡短的一行描述。
SYNOPSYS 命令的語法
DESCRIPTION 更詳細的描述
OPTIONS 所有可能的選項及其功能的概述
FILES 與當前專案相關的檔案(配置檔案等)
SEE ALSO 與當前主題相關的其他手冊頁

這些是手冊頁中可以預期找到的主要主題部分。

whatis 資料庫儲存系統上所有手冊頁的 NAME 部分。它透過每天的 cron 定期更新。whatis 資料庫具有以下兩個條目

name(key) – 一行描述

whatis 的語法為

whatis <string>

輸出是手冊頁的完整 NAME 部分,其中string 匹配named(key)

也可以使用 man 命令查詢 whatis 資料庫。語法為

man -k <string>

此命令類似於 apropos。與 whatis 不同,它將查詢資料庫的“名稱”和“一行描述”條目。如果字串與這些欄位中的任何一個單詞匹配,上述查詢將返回完整的NAME 部分。

示例:(匹配的字串已突出顯示)

whatis lilo

lilo (8) - install boot loader
lilo.conf [lilo] (5) - configuration file for lilo


man -k lilo

grubby (8) - command line tool for configuring grub, lilo, and elilo
lilo (8) - install boot loader
lilo.conf [lilo] (5) - configuration file for lilo

檔案系統層次結構標準,一種推薦的 Linux 檔案系統佈局,建議將手冊頁儲存在 /usr/share/man 中。但是,可以使用 /etc/man.config 中設定的 MANPATH 環境變數搜尋其他位置。每個目錄進一步劃分為子目錄,對應於手冊頁部分。

手冊頁部分
第 1 部分 有關可執行檔案的資訊
第 2 部分 系統呼叫,例如 mkdir(2)
第 3 部分 庫呼叫,例如 stdio(3)
第 4 部分 裝置(/dev 中的檔案)
第 5 部分 配置檔案和格式
第 6 部分 遊戲
第 7 部分 宏包
第 8 部分 管理命令
第 9 部分 核心例程

有時,具有相同名稱的手冊頁存在於多個部分中。

要訪問特定部分N,必須輸入

man N command

示例

[[Image:]]

$ man mkdir

$ man 2 mkdir

$ man crontab

$ man 5 crontab


file

file 用於嘗試檢測特定檔案的型別。

例如

$ file picture.png

picture.png: PNG image, 179 x 179, 8-bit/color RGBA, non-interlaced

該實用程式將識別命名不正確的檔案,因此,如果 picture.png 被命名為 readme.txt,則命令“file readme.txt”仍將識別該檔案為 png 檔案。


uname

uname 命令列印與核心版本、機器名稱、處理器型別和節點名稱相關的資訊。它最常用於識別機器執行的核心版本。

$ uname -r

列印當前執行核心的版本號。

pwd

這是一個簡單地列印 shell 的當前工作目錄的命令。



使用的檔案、術語和實用程式:* bash

  • echo
  • env
  • exec
  • export
  • pwd
  • set
  • unset
  • man
  • uname
  • history


上一章 | 下一章

華夏公益教科書