Ash - Linux命令 - UNIX命令

名稱

sh - 命令解釋器( shell

概要

sh [ - / + aCefnuvxIimqsVEbc ] [ - o longname ] - 字符 [ 目標... ]

描述

Sh是系統的標準命令解釋器。 sh的當前版本正在進行更改,以符合shell的POSIX 1003.2和1003.2a規範。 這個版本有很多功能,使它在某些方面與Korn shell相似,但它不是Korn shell克隆(請參閱ksh(1))。 只有POSIX指定的功能加上幾個伯克利擴展,才被納入到這個shell中。 我們期望在4.4 BSD發佈時符合POSIX標準 。 這個手冊頁並不打算成為教程或shell的完整規範。

概觀

shell是一個從文件或終端讀取行,解釋它們並通常執行其他命令的命令。 這是用戶登錄系統時運行的程序(儘管用戶可以使用chsh(1)命令選擇不同的shell)。 Shell實現了一種具有流控制結構的語言,這是一種除數據存儲外還提供各種功能的宏功能,以及內置的歷史和行編輯功能。 它集成了許多功能來幫助交互式使用,並且具有解釋性語言對於交互式和非交互式使用(shell腳本)都很常見的優點。 也就是說,命令可以直接輸入到正在運行的shell中,也可以放入一個文件中,並且該文件可以由shell直接執行。

調用

如果不存在任何參數,並且如果shell的標準輸入連接到終端(或者如果設置了-i標誌),並且-c選項不存在,則shell將被視為交互式shell 。 交互式shell通常會在每個命令之前提示並以不同方式處理編程和命令錯誤(如下所述)。 第一次啟動時,shell會檢查參數0,如果它以短劃線“ - ”開頭,則shell也被視為登錄shell。 這通常由系統在用戶首次登錄時自動完成。登錄shell首先從文件/ etc / profile和.profile(如果存在)讀取命令。 如果環境變量ENV在進入shell時設置,或者在登錄shell的.profile中設置,則shell接下來從ENV中命名的文件讀取命令。因此,用戶應該放置僅在.profile文件中的登錄時間以及ENV文件中每個shell都執行的命令。 要將ENV變量設置為某個文件,請將以下行放在您主目錄的.profile文件中

ENV = $ HOME / .shinit; 導出ENV

替換``.shinit''你想要的任何文件名 。 由於每次調用shell都會讀取ENV文件,包括shell腳本和非交互式shell,下面的範例對於將ENV文件中的命令限制為交互式調用很有用。 將命令放在下面的“case”和“ esac ”中(這些命令在後面描述):

case $ - in * i *)

命令僅用於交互式使用

...

ESAC

如果已經指定了除選項以外的命令行參數,那麼shell將第一個參數視為從中讀取命令的文件的名稱(shell腳本),其餘參數設置為shell的位置參數($ 1 ,$ 2等)。 否則,shell將從其標準輸入中讀取命令。

參數列表處理

所有的單字母選項都有一個相應的名稱,可用作-o選項的參數。 set -o名稱在下面的描述中的單個字母選項旁邊提供。 指定短劃線“ - ”將打開該選項,而使用加號“+”則禁用該選項。 以下選項可以通過命令行或集合(1)內置(稍後介紹)進行設置。

- 一個 allexport

導出分配給的所有變量。 (用於4.4alpha的UNIMPLEMENTED)

-C

從命令行讀取命令。 沒有命令將從標準輸入中讀取。

-C noclobber

不要用``>''覆蓋現有的文件(UNIMPLEMENTED for 4.4alpha)

-e errexit

如果不是交互式的,如果任何未經測試的命令失敗,立即退出。 如果該命令用於控制if elif whileuntil,或者該命令是“&&”或“||”運算符的左側操作數,則命令的退出狀態被視為明確測試過。

-f noglob

禁用路徑名擴展。

-n noexec

如果不是交互式,請閱讀命令但不要執行它們。 這對於檢查shell腳本的語法很有用。

-u 名詞集

嘗試展開未設置的變量時,將消息寫入標準錯誤,並且如果外殼不是交互式的,請立即退出。 (用於4.4alpha的UNIMPLEMENTED)

-v 冗長

shell在讀取時將其輸入寫入標準錯誤。 用於調試。

-x xtrace

將每個命令寫入標準錯誤 (在執行之前以“+”開頭),用於調試。

-q quietprofile

如果設置了-v-x選項,則在讀取初始化文件時不要應用它們,這些文件是/ etc / profile .profile和ENV環境變量指定的文件。

- 我 不理會

交互時忽略輸入的EOF。

-i 互動

強制shell以交互方式行為。

-m 監視器

打開作業控制(交互時自動設置)。

-s stdin

標準輸入讀取命令(如果沒有文件參數,則自動設置)。 這個選項在shell已經開始運行後(即set(1))設置後沒有效果。

-V vi

啟用內置的vi(1)命令行編輯器(如果已設置,則禁用 - E )。

-E emacs

啟用內置的emacs(1)命令行編輯器(如果已設置,則禁用 - V )。

-b 通知

啟用後台作業完成的異步通知。 (用於4.4alpha的UNIMPLEMENTED)

詞彙結構

shell根據文件中的行讀取輸入,並以空格(空白和製表符)將其分解為單詞,並在特定序列的字符處對稱為“運算符”的shell特殊序列。有兩種類型的運算符:控制操作員和重定向操作員(他們的含義在後面討論)。 以下是運營商列表:

“控制操作員:”

&&&(); ;; | || <換行符>

“重定向運營商:”

<>> | << >> <&>&<< - <>

引用

引用用於刪除某些字符或單詞對shell的特殊含義,如操作符,空格或關鍵字。 有三種引用類型:匹配的單引號,匹配的雙引號和反斜杠。

反斜杠

反斜線保留下列字符的字面含義,但Aq換行符除外。 Aq換行符之前的反斜杠被視為續行。

單引號

用單引號括起字符保留了所有字符的字面含義(單引號除外,因此不可能將單引號放在單引號字符串中)。

雙引號

在雙引號內包圍字符保留了除美元符號($)反引號(`)和反斜線(\)之外的所有字符的字面含義。雙引號內的反斜線在歷史上是奇怪的,並且僅用於引用以下字符:

$`\ <新行>

否則它仍然是文字。

保留字

保留字是對外殼具有特殊含義的字,並且在行的開頭和控制操作符之後被識別。 以下是保留字:

Ta elif Ta fi Ta Ta Ta

否則Ta為Ta然後Ta {Ta}

如果Ta Ta esac 做Ta Ta做Ta

他們的含義在後面討論。

別名

別名是使用別名 (1)內置命令設置的名稱和相應的值。 無論何時可能發生保留字(見上文),並且在檢查保留字之後,shell會檢查該字是否與別名相匹配。 如果確實如此,則用輸入流中的值替換它。 例如,如果有一個名為“lf”的別名,其值為“ls -F”,那麼輸入:

如果foobar

會成為

ls -F foobar

別名為幼稚的用戶提供了一種便捷的方式來創建命令的簡寫,而無需學習如何使用參數創建函數。 它們也可以用來創建詞法不明確的代碼。 這種使用是不鼓勵的。

命令

shell根據一種語言解釋它讀取的單詞,其規範不在本手冊頁的範圍內(請參閱POSIX 1003.2文檔中的BNF)。 本質上,讀取一行,如果該行的第一個字(或控制操作符之後)不是保留字,那麼shell已經識別出一個簡單的命令。 否則,複雜的命令或其他特殊構造可能已被識別。

簡單的命令

如果一個簡單的命令已被識別,那麼shell將執行以下操作:

  1. “name = value”形式的引導詞被剝離並分配給簡單命令的環境。 重定向操作符及其參數(如下所述)被刪除並保存以供處理。
  2. 其餘單詞按照“擴展”一節中的描述進行擴展,第一個剩餘單詞被認為是命令名稱,命令已定位。 其餘單詞被視為命令的參數。 如果沒有生成命令名,那麼在項1中識別的``name = value''變量賦值會影響當前shell。
  3. 重定向按照下一節所述執行。

重定向

重定向用於改變命令讀取輸入或發送輸出的位置。 通常,重定向打開,關閉或複制對文件的現有引用。 用於重定向的整體格式是:

[red] -ir文件

redir-op是前面提到的重定向操作符之一。 以下是可能的重定向列表。 Bq n是一個可選的數字,如'3'(而不是'Bq 3',指的是文件描述符。

[n]>文件

將標準輸出(或n)重定向到文件。

[n]> | 文件

相同,但覆蓋 - C選項。

[n] >>文件

將標準輸出(或n)附加到文件。

[n] <文件

從文件重定向標準輸入(或n)。

[n1] <&n2

從文件描述符n2複製標準輸入(或n1)。

[n] <& -

關閉標準輸入(或n)。

[n1]>&n2

從n2複製標準輸出(或n1)。

[n]>& -

關閉標準輸出(或n)。

[n] <>文件

打開標準輸入(或n)讀取和寫入文件。

以下重定向通常被稱為``here-document''

[n] <<分隔符

這裡-DOC文本...

分隔符

直到分隔符的連續行上的所有文本都被保存起來,並且可用於標準輸入的命令或文件描述符n(如果已指定)。 如果在首行中指定的分隔符被引用,那麼here-doc-text將被逐字處理,否則文本會經歷參數擴展,命令替換和算術擴展(如“擴展”一節所述) '如果操作符是“<< - ”而不是“<<”,那麼在here-doc-text中的前導標籤將被刪除。

搜索和執行

有三種類型的命令:shell函數,內置命令和普通程序 - 並且按照該順序搜索命令(按名稱)。 他們每個人都以不同的方式執行。

當執行一個shell函數時,所有的shell位置參數($ 0除外)都被設置為shell函數的參數。 顯式放置在命令環境中的變量(通過在函數名稱前面放置賦值)被設置為函數的本地值,並被設置為給定的值。 然後執行函數定義中給出的命令。 命令完成後,位置參數將恢復為其原始值。 這一切都發生在當前shell中。

Shell內置函數在內部執行到外殼,而不會產生新的進程。

否則,如果命令名稱與功能或內建不匹配,則在文件系統中搜索命令作為正常程序(如下一節所述)。 當正常程序執行時,shell運行程序,將參數和環境傳遞給程序。 如果程序不是一個正常的可執行文件(例如,如果它不是以“#!”為ASCII碼的“幻數”開始,那麼execve(2)會返回Er ENOEXEC),那麼shell將解釋程序子shell。 在這種情況下,子shell將自行重新初始化,因此效果就好像新的shell已被調用來處理臨時shell腳本,除了位於父shell中的散列命令的位置將被兒童。

請注意,本文檔以前的版本和源代碼本身誤導性地和零星地將不帶幻數的shell腳本稱為“shell過程”。

路徑搜索

在查找命令時,shell首先查看它是否具有該名稱的shell功能。 然後通過該名稱查找內置命令。 如果沒有找到內建命令,則會發生以下兩件事之一:

  1. 包含斜杠的命令名稱只是執行而不執行任何搜索。
  2. shell會依次搜索PATH中的每個條目以查找該命令。 PATH變量的值應該是由冒號分隔的一系列條目。 每個條目由一個目錄名稱組成。 當前目錄可以由空目錄名稱隱含指示,或者由一個單獨的句點明確指示。

命令退出狀態

每個命令都有一個退出狀態,可以影響其他shell命令的行為。 範例是,一個命令以正常或成功退出為零,而失敗,錯誤或錯誤指示為非零。 每個命令的手冊頁應指明各種退出代碼及其含義。 此外,內置命令返回退出代碼,就像執行的shell函數一樣。

複雜命令

複雜命令是簡單命令與控制操作符或保留字的組合,共同創建一個更大的複雜命令。 更一般地說,一個命令是以下之一:

除非另有說明,否則命令的退出狀態是由命令執行的最後一個簡單命令的狀態。

管道

管道是由控制操作符|分隔的一個或多個命令的序列。 除最後一個命令外的所有標準輸出都連接到下一個命令的標準輸入。 像往常一樣,最後一個命令的標準輸出是從shell繼承而來的。

管道的格式是:

[!] command1 [| command2 ...]

command1的標準輸出連接到command2的標準輸入。 標準輸入,標準輸出或兩個命令都被認為由流水線在由作為命令一部分的重定向操作符指定的任何重定向之前分配。

如果管道不在後台(稍後討論),則shell等待所有命令完成。

如果保留字! 不在管道之前,退出狀態是在管道中指定的最後一個命令的退出狀態。 否則,退出狀態是最後一個命令退出狀態的邏輯NOT。 也就是說,如果最後一個命令返回零,則退出狀態為1; 如果最後一個命令返回大於零,則退出狀態為零。

由於標準輸入或標準輸出的管道分配或兩者都在重定向之前發生,因此可以通過重定向進行修改。 例如:

$ command1 2>&1 | 命令2

將command1的標準輸出和標準錯誤都發送到command2的標準輸入。

一個 ; 或終止符導致前面的AND-OR-列表(下面描述)被順序執行; a會導致前面的AND-OR列表異步執行。

請注意,與其他一些shell不同,流水線中的每個進程都是調用shell的子進程(除非它是shell內建的,在這種情況下,它將在當前shell中執行 - 但它對環境的任何影響都將被清除)。

背景命令 -

如果命令由控制操作符&符號(&)終止,那麼shell將異步執行該命令 - 也就是說,在執行下一個命令之前,shell不會等待命令完成。

在後台運行命令的格式是:

command1&[command2&...]

如果shell不是交互式的,則異步命令的標準輸入設置為/ dev / null

列表 - 一般說來

列表是由換行符,分號或和號分隔的零個或多個命令的序列,並且可以由這三個字符之一終止。 列表中的命令按照它們寫入的順序執行。 如果命令後面跟著一個&符號,shell會啟動該命令並立即進入下一個命令; 否則它會在繼續下一個命令之前等待命令終止。

短路列表運算符

“&&”和“||”是AND-OR列表運算符。 `&&''執行第一個命令,然後在第一個命令的退出狀態為零時執行第二個命令。 ``||''類似,但是如果第一個命令的退出狀態為非零,則執行第二個命令。 “&&”和“||”都具有相同的優先級。

流程控制構造 - 如果,同時,為了

if命令的語法是

如果列表
然後列出
[elif list
然後列出] ...
[其他列表]
科幻

while命令的語法是

而列表
做清單
DONE

這兩個列表重複執行,而第一個列表的退出狀態為零。 直到命令是相似的,但是直到代替while為止,這會導致它重複,直到第一個列表的退出狀態為零。

for命令的語法是

對於詞中的變量...
做清單
DONE

單詞被展開,然後該列表被重複執行,並依次為每個單詞設置變量。 做和完成可以用“{”和“`”來代替

break和continue命令的語法是

休息[num]
繼續[num]

中斷終止num或最後的while循環。 繼續進行最內層循環的下一次迭代。 這些被實現為內置命令。

case命令的語法是

案件字
模式)列表;;
...
ESAC

該模式實際上可以是一個或多個模式(請參閱稍後描述的Shell模式),由“`”字符分隔。

將命令組合在一起

命令可以通過寫入來分組

(名單)

要么

{list;

其中的第一個在子shell中執行命令。 內置命令分組到一個(列表)不會影響當前的shell。 第二種形式不會分叉另一個外殼,所以效率稍高。 通過這種方式將命令組合在一起可以讓您重定向輸出,就像它們是一個程序一樣:

{printf hello; printf world \ n“;}>問候

功能

函數定義的語法是

name()命令

函數定義是一個可執行語句; 在執行時它會安裝一個名為name的函數並返回一個零的退出狀態。 該命令通常是一個列在“`{''和``}”之間的列表

通過使用本地命令可以將變量聲明為函數本地。 這應該顯示為函數的第一個語句,並且語法是

本地[變量| - ] ...

本地是作為內置命令實現的。

當一個變量是局部變量時,它將繼承初始值,並從周圍範圍中具有相同名稱的變量中導出和只讀標誌(如果有的話)。 否則,該變量最初是未設置的。 shell使用動態作用域,因此,如果將變量x local設為函數f,然後調用函數g,那麼對g中創建的變量x的引用將引用f中聲明的變量x,而不是名為x的全局變量。

唯一的特殊參數可以是局部變量````````````````當前任何外殼選項都可以通過函數內的set命令改變,以便在函數返回時恢復原始值。

返回命令的語法是

返回[exitstatus

它終止當前正在執行的功能。 返回是作為內置命令實現的。

變量和參數

shell維護一組參數。 由名稱表示的參數稱為變量。 啟動時,shell將所有環境變量轉換為shell變量。 可以使用表單設置新變量

名稱=值

由用戶設置的變量必須包含僅由字母,數字和下劃線組成的名稱 - 第一個名稱不能是數字。 參數也可以用數字或特殊字符表示,如下所述。

位置參數

位置參數是由數字(n> 0)表示的參數。 這些shell最初將它們設置為遵循shell腳本名稱的命令行參數的值。 set (1)builtin也可以用來設置或重置它們。

特殊參數

特殊參數是由以下特殊字符之一表示的參數。 該參數的值在其字符旁邊列出。

*

從一個開始擴展到位置參數。 當擴展發生在雙引號字符串內時,它將擴展為單個字段,每個參數的值由IFS變量的第一個字符分隔,如果IFS未設置,則由<空格>分隔。

@

從一個開始擴展到位置參數。 當擴展發生在雙引號內時,每個位置參數作為單獨的參數展開。 如果沒有位置參數,則@的擴展將生成零參數,即使@是雙引號也是如此。 例如,如果$ 1是“abc”而$ 2是“def ghi”,那麼Qq $ @擴展為兩個參數:

abc def ghi

擴展到位置參數的數量。

擴展到最新管道的退出狀態。

- (連字符)

根據調用,set builtin命令或Shell隱式指定,擴展為當前選項標誌(單字母選項名稱連接成一個字符串)。

$

擴展到被調用的shell的進程ID。 子外殼保留與其父母相同的$值。

擴展為從當前shell執行的最新後台命令的進程ID。 對於管道,進程ID是管道中最後一個命令的ID。

0(零)。

擴展為shell或shell腳本的名稱。

文字擴展

本節描述了對單詞執行的各種擴展。 如後文所述,並非所有擴展都在每個單詞上執行。

在單個單詞中出現的Tilde擴展,參數擴展,命令替換,算術擴展和引用移除可擴展為單個字段。 只有字段分割或路徑名擴展可以從一個單詞創建多個字段。 如上所述,該規則的一個例外是特殊參數@在雙引號內的擴展。

單詞擴展的順序是:

  1. Tilde擴展,參數擴展,命令替換,算術擴展(這些都是同時發生的)。
  2. 除非IFS變量為空,否則字段拆分在步驟(1)生成的字段上執行。
  3. 路徑名擴展(除非設置-f有效)。
  4. 報價清除。

$字符用於引入參數擴展,命令替換或算術評估。

Tilde擴展(代替用戶的主目錄)

以不加引號的代字符(〜)開頭的單詞將經歷代字符擴展。 所有直到斜杠(/)或單詞結尾的字符都被視為用戶名,並被用戶的主目錄替換。 如果用戶名缺失(如在〜/ foobar中),代字號將被替換為HOME變量(當前用戶的主目錄)的值。

參數擴展

參數擴展的格式如下所示:

表達式由所有字符組成,直到匹配的“}”任何“}”由反斜線或帶引號的字符串轉義,並且嵌入的算術擴展,命令替換和變量擴展中的字符在確定匹配``}''

參數擴展最簡單的形式是:

參數的值(如果有的話)被替換。

參數名稱或符號可以用大括號括起來,除了位置參數超過一位數字或參數後面跟著一個可以解釋為名稱一部分的字符之外,這些參數是可選的。 如果參數擴展發生在雙引號內:

  1. 擴展結果不會執行路徑名擴展。
  2. 字段拆分不會對擴展結果執行,但@除外。

另外,可以使用以下格式之一修改參數擴展。

使用默認值。 如果參數未設置或為空,則替換單詞的擴展名; 否則,參數的值被替換。

分配默認值。 如果參數未設置或為空,則將單詞的擴展分配給參數。 在所有情況下,參數的最終值都會被替換。 只有變量,而不是位置參數或特殊參數,可以用這種方式分配。

如果為空或未設置,則指示錯誤。 如果參數未設置或為空,則字的擴展(或者指示它的消息未被設置,如果字被省略)被寫入標準錯誤,並且shell以非零退出狀態退出。 否則,參數的值將被替換。 交互式shell不需要退出。

使用替代值。 如果參數未設置或為null,則替換為null; 否則,詞的擴展被替換。

在前面顯示的參數擴展中,以格式使用冒號會導致對未設置或null參數的測試; 省略冒號會導致僅對未設置的參數進行測試。

字符串長度。 參數值的字符長度。

以下四種參數擴展提供了子串處理。 在每種情況下,模式匹配符號(請參閱Shell模式),而不是正則表達式符號,用於評估模式。 如果參數是*或@,則擴展的結果是未指定的。 將完整的參數展開字符串括在雙引號中並不會導致引用以下四種模式字符,而括號中的引號字符具有此效果。

刪除最小的後綴模式。 這個詞被擴大到產生一個模式。 然後參數展開產生參數,後綴的最小部分由被刪除的模式匹配。

刪除最大的後綴模式。 這個詞被擴大到產生一個模式。 然後參數展開產生參數,後綴的最大部分由被刪除的模式匹配。

刪除最小的前綴模式。 這個詞被擴大到產生一個模式。 然後參數展開產生參數,其中與被模式匹配的前綴的最小部分被刪除。

刪除最大的前綴模式。 這個詞被擴大到產生一個模式。 然後參數展開產生參數,其中前綴的最大部分由被刪除的模式匹配。

命令替換

命令替換允許替換命令名稱本身的輸出。 當命令被包含時,命令替換發生如下:

$(命令)

或寶``反引號''版本Pc:

`command`

shell通過在子shell環境中執行命令來擴展命令替換,並用命令的標準輸出替換命令替換,並在替換結束時刪除一個或多個的序列。 (在輸出結束之前嵌入 s不會被刪除;但是,在字段拆分過程中,它們可能會被轉換為 s,具體取決於IFS的值和引用是否有效。)

算術擴展

算術擴展提供了一種評估算術表達式並替換其值的機制。 算術擴展的格式如下所示:

$((表達式))

該表達式被視為使用雙引號,除非表達式中的雙引號沒有專門處理。 外殼擴展了表達式中的所有標記以進行參數擴展,命令替換和引用移除。

接下來,shell將它視為一個算術表達式並替換錶達式的值。

白色空間分裂(場分裂)

在參數擴展,命令替換和算術擴展之後,shell會掃描擴展和替換的結果,而這些擴展和替換的結果在雙引號中不會出現在字段拆分中,並且會導致多個字段。

shell將IFS的每個字符視為分隔符,並使用分隔符將參數擴展和命令替換的結果拆分為字段。

路徑名稱擴展(文件名稱生成)

除非設置了-f標誌,否則在分詞完成後執行文件名稱生成。 每個單詞都被看作是一系列用斜杠分隔的模式。 擴展過程用與所指定模式匹配的字符串替換每個模式的所有現有文件的名稱來替換該單詞的名稱。 對此有兩個限制:第一,模式不能匹配包含斜線的字符串;第二,模式不能匹配以句點開頭的字符串,除非模式的第一個字符是句點。 下一節描述用於路徑名擴展和情況(1)命令的模式。

殼模式

一個模式由普通字符組成,這些字符匹配自己和元字符。 元字符是``````````````''和``''如果引用這些字符,它們會失去其特殊含義。 當執行命令或變量替換並且美元符號或後引號不是雙引號時,會掃描這些字符的變量值或命令輸出,並將它們轉換為元字符。

星號(``*'')匹配任何字符串。 問號可以匹配任何單個字符。 左括號(``['')引入一個字符類。 如果缺少``'''',那麼字符類的末尾用(```'''')表示,然後'`''匹配'[''而不是引入一個字符類。 字符類匹配方括號之間的任何字符。 可以使用減號指定一系列字符。 字符類可以通過將感嘆號設置為字符類的第一個字符來補充。

要在一個字符類中包含一個``]'',使它成為列出的第一個字符(在'!'之後(如果有的話))。 要包括一個減號,使其成為列出的第一個或最後一個字符

內置命令

本節列出了內置的內置命令,因為它們需要執行一些獨立進程無法執行的操作。 除此之外,還有其他幾個命令可以用於提高效率(例如回顯 1)。

返回0(真)退出值的空命令。

文件

指定文件中的命令由shell讀取並執行。

別名 [ 名稱 [ =字符串... ]]

如果指定了name = string ,那麼shell會使用值string定義別名。如果僅指定name,則會打印別名的值。 如果沒有參數, 別名內建輸出所有定義的別名的名稱和值(請參閱unalias)

bg [ 工作] ...

在後台繼續指定的作業(或當前作業,如果沒有作業)。

命令 命令arg ...

執行指定的內置命令。 (當你有一個與內建命令同名的shell函數時,這很有用。)

cd [ 目錄 ]

切換到指定的目錄(默認為$ HOME)如果cd命令的環境中出現CDPATH條目或設置了shell變量CDPATH且目錄名稱不以斜杠開頭,則會搜索CDPATH中列出的目錄為指定的目錄。 CDPATH的格式與PATH的格式相同在交互式shell中,如果cd命令與用戶給出的名稱不同, cd命令將打印出實際切換到的目錄的名稱。 由於CDPATH機制被使用或者因為符號鏈接被跨越,這些可能會不同。

評估 字符串...

用空格連接所有參數。 然後重新解析並執行該命令。

exec [ command arg ... ]

除非省略命令,否則shell進程會被指定的程序(它必須是一個真正的程序,而不是shell內置的函數)替換。 exec命令上的任何重定向都將被標記為永久的,以便在exec命令完成時它們不會被撤消。

退出 [ exitstatus ]

終止shell進程。 如果給出了exitstatus ,它將用作shell的退出狀態; 否則使用上述命令的退出狀態。

導出 名稱...

導出-p

指定的名稱將被導出,以便它們將出現在後續命令的環境中。 取消導出變量的唯一方法是取消設置。 shell允許在寫入時導出變量的值

導出名稱=值

export命令不帶任何參數列出所有導出變量的名稱。 使用指定的-p選項,輸出將被格式化為適合非交互式使用。

fc [ - e 編輯器 ] [ 第一 [ 最後 ]]

fc -l [ - nr ] [ first [ last ]]

fc -s [ old = new ] [ first ]

內置的fc列出或編輯並重新執行先前輸入到交互式shell的命令。

-e編輯器

使用編輯器命名的編輯器編輯命令。 編輯器字符串是一個命令名稱,需要通過PATH變量進行搜索。 未指定-e時, FCEDIT變量中的值將用作默認值。 如果FCEDIT為空或未設置,則使用EDITOR變量的值。 如果EDITOR為空或未設置,則ed(1)用作編輯器。

-l(ell)

列出命令而不是調用它們的編輯器。 命令以第一個和最後一個操作數指示的順序寫入,受到-r影響,每個命令都以命令編號開頭。

-n

使用-l列出時禁止命令編號。

-r

顛倒列出的命令的順序(使用-l或編輯(既不使用-l也不使用s)

-s

不調用編輯器重新執行該命令。

第一

持續

選擇要列出或編輯的命令。 先前可以訪問的命令的數量由HISTSIZE變量的值決定。 第一個或最後一個或兩個值都是以下值之一:

[+]數

表示命令編號的正數; 命令號碼可以用-l選項顯示。

-數

表示先前執行的命令數的命令的負數十進制數。 例如,-1是前一個命令。

一個字符串,指示以該字符串開頭的最近輸入的命令。 如果old = new操作數不是用 - s指定的,則第一個操作數的字符串形式不能包含嵌入的等號。

以下環境變量影響fc的執行:

FCEDIT

要使用的編輯器的名稱。

HISTSIZE

先前可訪問的命令的數量。

fg [ 工作 ]

將指定的作業或當前作業移到前台。

getopts optstring var

POSIX getopts命令不要與貝爾實驗室衍生的getopt(1)混淆。

第一個參數應該是一系列字母,每個字母后面可以有一個冒號,以表示該選項需要參數。 指定的變量被設置為解析的選項。

getopts命令由於處理了包含空格的參數而棄用了較早的getopt(1)實用程序。

getopts內建函數可用於從參數列表中獲取選項及其參數。 調用時, getopts將選項字符串中的下一個選項的值放入var指定的shell變量的列表中,並將其索引放入shell變量OPTIND中。調用shell時, OPTIND初始化為1.對於每個需要一個參數, getopts內建函數將它放在shell變量OPTARG中如果在optstring中不允許有一個選項,那麼OPTARG將被取消設置。

optstring是一串可識別的選項字母。 如果一個字母后跟一個冒號,該選項預計會有一個參數,它可能會或可能不會被空格分隔。 如果在預期的地方找不到選項字符, getopts會將變量var設置為“?”, getopts將取消設置OPTARG並將輸出寫入標準錯誤。 通過指定一個冒號作為optstring的第一個字符,所有錯誤都將被忽略。

達到最後一個選項時返回非零值。 如果沒有剩餘的參數, getopts會將var設置為特殊選項,否則將設置var為``?''

以下代碼片段顯示瞭如何處理可以採用選項[a]和[b]的命令的參數以及需要參數的選項[c]。

而getopts abc:f

情況下$ f in
a | b)flag = $ f ;;
c)carg = $ OPTARG ;;
\?)echo $ USAGE; 1號出口;;
ESAC
DONE
轉移`expr $ OPTIND - 1`

該代碼將接受以下任何等效的代碼:

cmd -acarg文件文件
cmd -a -c arg文件文件
cmd -carg -a文件文件
cmd -a -carg - 文件文件

hash -rv 命令...

shell維護一個記錄命令位置的散列表。 無論使用什麼參數, hash命令都會打印出此表的內容。 自上次cd命令後未查看的條目標有星號; 這些條目可能無效。

使用參數, 散列命令從散列表中除去指定的命令(除非它們是函數),然後定位它們。 使用-v選項,hash會在找到它們時打印命令的位置。 -r選項會導致hash命令刪除散列表中除函數之外的所有條目。

jobid [ 工作 ]

打印作業中進程的進程ID。 如果作業參數被省略,則使用當前作業。

工作

該命令列出了當前shell進程的子進程的所有後台進程。

PWD

打印當前目錄。 內建命令可能與具有相同名稱的程序不同,因為內置命令會記住當前目錄的內容,而不是每次重新計算它。 這使得它更快。 但是,如果當前目錄已重命名,則內置版本的pwd將繼續打印該目錄的舊名稱。

閱讀 [ - p 提示符 ] [ - r ] 變量...

如果指定了-p選項並且標準輸入是終端,則會打印提示。 然後從標準輸入讀取一行。 從行中刪除尾隨的換行符,並按照上面的單詞拆分章節中所述拆分該行,並且按順序將這些段分配給變量。 至少必須指定一個變量。 如果有更多的塊比變量,其餘的塊(以及IFS中將它們分開的字符)分配給最後一個變量。 如果有多個變量而不是塊,則剩餘的變量將被分配空字符串。 內置將指示成功,除非在輸入時遇到EOF,在這種情況下將返回失敗。

默認情況下,除非指定了-r選項,否則“\”作為轉義字符,導致以下字符被直接處理。 如果反斜線後面跟有換行符,則反斜杠和換行符將被刪除。

只讀 名稱...

只讀-p

指定的名稱被標記為只讀,以便它們不能隨後被修改或取消設置。 shell允許一個變量的值在被標記為只讀的同時被設置

只讀名稱=值

readonly命令不帶任何參數列出所有隻讀變量的名稱。 使用指定的-p選項,輸出將被格式化為適合非交互式使用。

設置 [{ - 選項| +選項| - arg ... ]

set命令執行三個不同的功能。

沒有參數,它列出了所有shell變量的值。

如果給出選項,它將設置指定的選項標誌,或按照名為Sx參數列表處理的部分所述清除它們。

set命令的第三個用途是將shell的位置參數的值設置為指定的參數。 要更改位置參數而不更改任何選項,請使用“ - ”作為第一個參數進行設置。 如果不存在參數,則set命令將清除所有位置參數(相當於執行`` shift $#'。'')。

變量值

賦值給變量。 (通常最好是寫變量=值而不是使用setvar setvar旨在用於將值賦予名稱作為參數傳遞的變量的函數中。)

shift [ n ]

移動位置參數n次。 換班$ 1的值設置為$ 2的值,將$ 2的值設置為$ 3的值,依此類推,將$#的值 1。 如果n大於位置參數的數量, shift會發出錯誤信息,並退出並返回狀態2。

打印shell的累計用戶和系統時間以及從shell運行的進程。 返回狀態是0。

陷阱 動作 信號 ...

當收到任何指定的信號時,使shell解析並執行操作。 信號由信號編號指定。 如果信號0 ,則在shell退出時執行該操作。 動作可能為空或“ - ”,前者會導致指定的信號被忽略,後者會導致採取默認動作。 當shell剝離一個子shell時 ,它會將捕獲的(但不被忽略的)信號重置為默認操作。 trap命令對進入shell時被忽略的信號沒有影響。

鍵入 [ name ... ]

將每個名稱解釋為命令並打印命令搜索的分辨率。 可能的解決方案是:shell關鍵字,別名, shell內置 ,命令,跟踪別名和未找到。 為別名打印別名擴展; 對於命令和跟踪的別名,打印命令的完整路徑名。

ulimit [ - H -S ] [ - a -tfdscmlpn [ value ]]

查詢或設置流程的硬性或軟性限製或設置新的限制。 硬限制(不允許進程被允許違反,並且一旦它被降低後不會被提升)和軟限制(其導致進程被發信號但不一定被殺死,並且可能被提出)之間的選擇由這些標誌:

-H

設置或詢問硬限制

-S

設置或詢問軟限制。 如果沒有指定 - H和 - S ,則顯示軟極限或設置兩個極限。 如果兩者都被指定,則最後一個獲勝。

然後,通過指定這些標誌中的任何一個來選擇要詢問或設置的限制:

-一個

顯示所有當前的限制

-t

顯示或設置CPU時間限制(以秒為單位)

-F

顯示或設置可創建的最大文件的限制(以512字節塊為單位)

-d

顯示或設置進程數據段大小的限制(以千字節為單位)

-s

顯示或設置進程堆棧大小的限制(以千字節為單位)

-C

顯示或設置可產生的最大核心轉儲大小限制(以512字節塊為單位)

-m

顯示或設置進程可以使用的總物理內存限制(以千字節為單位)

-l

顯示或設置進程可以用mlock鎖定多少內存的限制(2)(以千字節為單位

-p

顯示或設置此用戶可同時擁有的進程數限制

-n

顯示或設置一個進程可以一次打開的數字文件的限制

如果沒有指定這些,則顯示或設置文件大小限制。 如果指定了值,則將限制設置為該數字; 否則顯示當前限制。

可以使用sysctl(8)實用程序顯示或設置任意進程的限制。

umask [ 掩碼 ]

將umask的值(請參閱umask(2))設置為指定的八進制值。 如果省略參數,則會打印umask值。

unalias [ - a ] [ 名字 ]

如果指定了名稱 ,則shell將刪除該別名。 如果指定了-a,則會刪除所有別名。

取消設定 名稱...

指定的變量和函數未設置並未導出。 如果一個給定的名字同時對應一個變量和一個函數,則該變量和函數都是未設置的。

等待 [ 工作 ]

等待指定的作業完成並返回作業中最後一個進程的退出狀態。 如果省略參數,請等待所有作業完成,並返回退出狀態為零。

命令行編輯

當從終端以交互方式使用sh時 ,可以使用vi模式命令行編輯來編輯當前命令和命令歷史記錄(請參閱Sx Builtins中的fc )。 該模式使用以下描述的命令,類似於vi手冊頁中描述的那些命令的子集。 命令`set'-o vi啟用vi模式編輯並將sh置入vi插入模式。 啟用vi模式後,sh可以在插入模式和命令模式之間切換。 編輯器在這裡沒有完整描述,但會在後面的文檔中。 它類似於vi:打字Aq ESC會讓你進入命令VI命令模式。 在命令模式下命中Aq會將該行傳遞給shell。

重要提示:使用man 命令%man )查看特定計算機上的命令使用方式。