Shell十三問[轉]

Shell十三問


轉載於網絡,稍加整理。linux

(一) 爲什麼叫作Shell?

咱們知道計算機的運做不能離開硬件,但使用者卻沒法直接對硬件做驅動,硬件的驅動只能透過一個稱爲"操做系統(Operating System)"的軟件來控管,事實上, 咱們天天所談的linux , 嚴格來講只是一個操做系統, 咱們稱之爲"核心(kernel)"。然而,從使用者的角度來講,使用者也沒辦法直接操做 kernel ,而是透過 kernel 的"外殼"程序,也就是所謂的 shell ,來與 kernel 溝通。這也正是 kernel 跟 shell 的形像命名關係。shell

從技術角度來講, shell 是一個使用者與系統的互動界面(interface),主要是讓使用者透過命令行(command line)來使用系統以完成工做。所以, shell 的最簡單的定義就是---命令解譯器(Command Interpreter)bash

  • 將使用者的命令翻譯給核心處理,
  • 同時,將核心處理結果翻譯給使用者

每次當咱們完成系統登入(log in), 咱們就取得一個互動模式的 shell , 也稱爲 login shell或 primary shell。
若從進程(process)角度來講,咱們在 shell 所下達的命令,均是 shell 所產生的子進程。這現像,咱們暫可稱之爲 fork 。
若是是執行腳本(shell script)的話,腳本中的命令則是由另一個非互動模式的子 shell(sub shell)來執行的。
也就是 primary shell 產生 sub shell 的進程, sub shell 再產生 script 中全部命令的進程。網絡

(二) shell prompt(PS1) 與 Carriage Return(CR) 的關係?

當你成功登陸進一個文字界面以後,大部份情形下,你會在熒幕上看到一個不斷閃爍的方塊或底線(視不一樣版本而別),咱們稱之爲遊標(coursor)
遊標的做用就是告訴你接下來你從鍵盤輸入的按鍵所插入的位置,且每輸如一鍵遊標便向右邊移動一個格子,若連續輸入太多的話,則自動接在下一行輸入。
假如你剛完成登陸還沒輸入任何按鍵以前,你所看到的遊標所在位置的同一行的左邊部份,咱們稱之爲提示符號(prompt)。
提示符號的格式或因不一樣系統版本而各有不一樣,在 Linux 上,只需留意最接近遊標的一個可見的提示符號,一般是以下二者之一:
$:給通常使用者賬號使用
#:給 root (管理員)賬號使用學習

事實上, shell prompt 的意思很簡單:ui

  • 是 shell 告訴使用者:您如今能夠輸入命令行了。

咱們能夠說,使用者只有在獲得 shell prompt 才能打命令行,而 cursor 是指示鍵盤在命令行所輸入的位置,使用者每輸入一個鍵, cursor 就日後移動一格,直到碰到命令行讀進 CR(Carriage Return,由 Enter 鍵產生)字符爲止。
CR 的意思也很簡單:編碼

  • 是使用者告訴 shell:老兄你能夠執行個人命令行了。

嚴格來講,所謂的命令行,就是在 shell prompt 與 CR 字符之間所輸入的文字。spa

系統可接受的命令名稱(command-name)能夠從以下途徑得到:操作系統

  • 明確路徑所指定的外部命令
  • 命令別名(alias)
  • 自定功能(function)
  • shell 內建命令(built-in)
  • $PATH 之下的外部命令

每個命令行均必須含用命令名稱,這是不能缺乏的。命令行

echo知多少?

echo 是一個很是簡單、直接的 Linux 命令:
將 argument 送出至標準輸出(STDOUT),一般就是在監視器(monitor)上輸出。

先運行一下echo命令:

$ echo

$

會發現只有一個空白行,而後又回到 shell prompt 上了。
這是由於 echo 在預設上,在顯示完 argument 以後,還會送出一個換行符號(new-line
charactor)。
可是上面的 command 並沒任何的 argument ,那結果就只剩一個換行符號了...
若你要取消這個換行符號,可利用 echo-n option

$ echo -n
$

要想看看 echo 的 argument ,可試試以下的輸入:

$ echo hello
hello
$ echo -n hello
hello$

上兩個 echo 命令中,你會發現 argument 的部份顯示在你的熒幕,而換行符號則視 -n option 而定。
很明顯的,第二個 echo 因爲換行符號被取消了,接下來的 shell prompt 就接在輸出結果同
一行了。

事實上, echo 除了 -n options 以外,經常使用選項還有:

-e :啓用反斜線控制字符的轉換
-E:關閉反斜線控制字符的轉換
-n :取消行末之換行符號

關於 echo 命令所支持的反斜線控制字符以下表:

\a: ALERT / BELL (從系統喇叭送出鈴聲)
\b: BACKSPACE ,也就是向左刪除鍵
\c:取消行末之換行符號
\E: ESCAPE,跳脫鍵
\f: FORMFEED,換頁字符
\n: NEWLINE,換行字符
\r: RETURN,回車鍵
\t: TAB,表格跳位鍵
\v: VERTICAL TAB,垂直表格跳位鍵
\n: ASCII 八進位編碼(以 x 開首爲十六進制)
\\:反斜線自己

(四) " "‘ ’的區別?

通過前面兩章的學習,應該很清楚當你在 shell prompt 後面敲打鍵盤、直到按下 Enter 的時
候,你輸入的文字就是 command line 了,而後 shell 纔會以行程的方式執行你所交給它的命令。
可是,在 command line 輸入的每個文字,對 shell 來講,是有類別之分的!
簡單而言, command line 的每個 charactor ,分爲以下兩種:

  • literal:也就是普通純文字,對 shell 來講沒特殊功能。
  • meta:對 shell 來講,具備特定功能的特殊保留字符。

Literal 沒甚麼好談的,凡舉 abcd、 123456 這些"文字"都是 literal ,但 meta 卻常使咱們困惑。
事實上,前兩章咱們在 command line 中已碰到兩個機乎每次都會碰到的 meta :

  • IFS:由 <space><tab><enter> 三者之一組成(咱們經常使用 space )。
  • CR:由 <enter> 產生。

IFS 是用來拆解 command line 的每個詞(word)用的,由於 shell command line 是按詞來處理的。
而 CR 則是用來結束 command line 用的,這也是爲什麼咱們敲 命令就會跑的緣由。
除了 IFS 與 CR ,經常使用的 meta 還有:

=   : 設定變量。
$   : 做變量或運算替換(請不要與 shell prompt 搞混了)。
>   :重導向 stdout。
<   :重導向 stdin。
|   :命令管線。
&   :重導向 file descriptor ,或將命令置於背境執行。
( ) :將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ } :將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。
;   :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&&  :在前一個命令結束時,若返回值爲 true,繼續執行下一個命令。
||  :在前一個命令結束時,若返回值爲 false,繼續執行下一個命令。
!   :執行 history 列表中的命令

假如咱們須要在 command line 中將這些保留字符的功能關閉的話,就須要 quoting 處理了。在 bash 中,經常使用的 quoting 有以下三種方法:

  • hard quote:' ' (單引號),凡在 hard quote 中的全部 meta 均被關閉。
  • soft quote: " "(雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如$ )。
  • escape :  (反斜線),只有緊接在 escape (跳脫字符)以後的單一 meta 才被關閉。

下面的例子將有助於咱們對 quoting 的瞭解:

$ A=B C # 空格鍵未被關掉,做爲 IFS 處理。
$ C: command not found.
$ echo $A
$
$ A="B C" # 空格鍵已被關掉,僅做爲空格鍵處理。
$ echo $A
B C

在第一次設定 A 變量時,因爲空格鍵沒被關閉, command line 將被解讀爲:

  • A=B 而後碰到<IFS>,再執行 C 命令。在第二次設定 A 變量時,因爲空格鍵被置於 soft quote 中,所以被關閉,再也不做爲 IFS :
  • A=B<space>C

空格鍵不管在 soft quote 仍是在 hard quote 中,均會被關閉。 Enter 鍵亦然。

相關文章
相關標籤/搜索