Linux 伺服器系統管理第十一章 外殼進階操作  上一頁    下一頁

11-4 Shell 特殊操作

內容:

為了提高 Shell 的處理能力,一般 Shell 環境都會提供一些特殊操作的工具,而且在不同 Shell 環境之間,這些特殊工具大致上還是可以相容。

11-4-1 輸入/輸出轉向

當執行某一命令時,也許需要輸入某些資料,執行後可能會有結果輸出,或執行當中發生錯誤則需要輸出錯誤訊息告知使用者,Unix 系統都將這些輸入/輸出設定成標準化,如下(如同 C 語言):

Ø  標準輸入(stdin,代號 0):鍵盤輸入。

Ø  標準輸出(stdout,代號 1):終端機輸出。

Ø  標準錯誤輸出(stderr,代號 2):終端機輸出。

如同 C 語言一般,可以透過設定檔將上述標準輸入/輸出轉移到其他硬體裝置上。有時候為了方便操作,也可直接將標準輸入/輸出轉向到其他檔案;亦即將鍵盤輸入或終端機輸出由另一個檔案來取代它的輸入與輸出。轉向方法如下:

Ø  <』:輸入轉向。將鍵盤輸入由另一個輸入(如檔案)取代。

Ø  >』:輸出轉向。將輸出到終端機的資料(標準輸出或錯誤輸出)轉向到另一個位置(如檔案)上。

Ø  >>』:輸出附加轉向。將所輸出的資料附加(append)到另一個檔案之後。

以下用幾個範例來說明轉向的功能:

(A) 【輸出轉向 – “>”

『輸出轉向』是將原來終端機輸出轉向到另一個裝置(或檔案)上。如果所轉向的目的檔案不存在時,系統會自動建立新檔案並寫入資料;如該檔案存在的話,會寫入並覆蓋原資料(原資料將遺失掉)。範例操作如下:

$ cat file_4                     【觀察 file_4 內容】

Good Luck To You !!

$ cat file_4 >file_6       【將 file_4 連結並轉向輸出到 file_6

$ cat file_6                     【查閱 file_6 內容】

Good Luck To You !!

$

(B) 【輸出附加轉向 – “>>”

如果轉向目標是已存在的檔案,又希望保存原來資料的話,就必須利用『輸出附加轉向』,它會將新的資料寫在原資料的後面,而且不會覆蓋舊資料。操作範例如下:

$ cat file_5                   【觀察 file_5 內容】

How Are You ?

$ cat file_5 >>file_6  【將 file_5 連結轉向附加在 file_6 後面】

$ cat file_6                   【查閱 file_6 內容】

Good Luck To You !!

How Are You ?

$

(C) 【輸入轉向 – “<”

『輸入轉向』是將原來由鍵盤輸入的資料,轉向由另一個週邊裝置取代,最簡單的輸入轉向是檔案輸入來取代鍵盤輸入,操作範例如下:

$ cat  <file_6  >file_7  【將 file_6 連結顯示,並轉向輸出到 file_7

$ cat  file_7          【查閱 file_7 內容】

Good Lucky To You !!

How Are You ?

$

(D) 『終端機複製』

Unix 使用者時常利用 cat 命令將終端機上的顯示複製到某一檔案上,用來產生一個新檔案。這對於產生小檔案非常方便,範例如下:

$ cat  >file_4                【將輸出連結轉向到 file_4

Good Lucky To You !!

?

[2]+  Stopped                 cat >file_4

11-4-2 管道輸入與輸出

『管道』(pipe|是用來連結兩個以上的命令,將前面命令執行的結果,轉向成後面命令的輸入(command | command)。譬如,$cat file_1 | sort,表示前面命令 cat file_1 的執行結果,經過管道轉向成後面 sort 命令的輸入,至於sort 命令的輸出結果就送給標準輸出,由終端機顯示出來。上述命令是由大到小排序顯示 file_1 的內容。管道的操作範例如下:

$ cat file_2 |sort

adm:x:3:4:adm:/var/adm:/sbin/nologin

amanda:x:33:6:Amanda user:/var/lib/amanda:/bin/bash

apache:x:48:48:Apache:/var/www:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

canna:x:39:39:Canna Service User:/var/lib/canna:/sbin/nologin

csu001:x:501:501::/home/csu001:/bin/bash

csu003:x:504:504::/home/csu003:/bin/bash

csu004:x:505:505::/home/csu004:/bin/bash

….

11-4-3 聚集命令輸入

所謂『命令行』(Command line)操作,表示每一行輸入一個命令,並且以交談方式繼續輸入下一個命令。在許多情況若需要同時輸入多個命令時,則可利用『分號』(;)將命令聚集在一起。範例如下:

$ echo "多命令聚集                  【單一 echo 命令】

多命令聚集

$ date                               【單一 date 命令】

Sun Jun 12 14:19:00 CST 2005

$ ls                                 【單一 ls 命令】

level  object  Welcome

$

$ echo "多命令聚集";date ;ls             【聚集上述三個命令】

多命令聚集

Sun Jun 12 14:18:35 CST 2005

level  object  Welcome

上述範例中,首先個別輸入 echodate ls 三個命令,接著在同一命令行中輸入同樣命令,並利用『分號』(;)分隔這些命令,發現會得到相同的結果。聚集多個命令也可以利用『轉向』(>),將輸入轉向到另一個檔案,但必須利用『小括號』((  ))將這些命令包起來,範例如下:

$ (echo "多命令聚集";date ;ls) > file_1

$ cat file_1

多命令聚集

Sun Jun 12 14:28:10 CST 2005

file_1

level

object

Wellcome

11-4-4 程序中斷

當使用者下達一個命令之後,Shell 立即產生一個程序(Process)來執行該命令,且程序會在執行完該命令隨之消失。然而若一個程序執行很久無法完成時,可利用『Ctrl + c』(先按住 Ctrl 鍵再按 C 鍵)強迫中斷該程序。我們利用一個 sleep(沉睡)程序的產生與中斷作為範例來說明,操作如下:

$ sleep 30

            【提示符號不見,按入 Ctrl + c 後中斷程序再出現 $

$

沉睡命令 sleep n 表示 Shell 執行一些無意義的程式 n 秒。在執行當中將不會出現提示符號($),其中 n 秒也不會很準確。執行中可輸入 Ctrl + c 中斷該命令,其他命令一樣可以利用相同的方法來中斷。

11-4-5 背景執行

基本上,使用者與 Shell 之間是交談式(Interactive)的溝通,使用者下達命令之後,Shell 立即接受命令並執行它,執行當中 Shell 因無暇掃描鍵盤,所以沒有任何輸出到終端機上;此時使用者將無法繼續輸入命令,好像與系統斷了線失去聯絡一般,直到 Shell執行完命令之後,才會繼續掃描鍵盤,並將執行結果顯示到終端機上,如此所產生的程序稱之為『前景執行』(Foreground process)。如果期望命令執行當中,Shell 能繼續掃描鍵盤,並讓使用者繼續輸入命令的話(Shell 也可以繼續接收並處理命令),則必須將它設定成『背景程序』(Background process),其設定方法只要在命令的後面加入一個『&』記號即可。基本上,背景程序與前景程序的運作情況完全相同,執行完畢之後,都會由標準輸出顯示其結果。接下來利用 jobs(顯示執行工作)、ps(顯示程序狀態)、vi(文書編輯)與 kill(刪除程序)命令,來測試背景程序的運作,操作如下:

Ø  產生一個背景程序:($ vi &

$ vi test1.c &

[1] 541

$ vi test2.c &

[2] 542

[1]+  Stopped                 vim test1.c

Ø  觀察目前使用者所下的工作:

$ jobs

[1]-  Stopped                 vim test1.c

[2]+  Stopped                 vim test2.c

$ ps –ef | grep tsnien| grep vim

tsnien     541 32726  0 15:57 pts/6    00:00:00 vim test1.c

tsnien     542 32726  0 15:57 pts/6    00:00:00 vim test2.c

tsnien     545 32726  0 15:58 pts/6    00:00:00 grep vim

使用者可鍵入 jobs 命令,觀察到自己所下達的背景程式(或工作)。另一種方式是利用 psprocess status)命令觀察系統有哪些執行中的程序,再利用檢蒐命令,搜尋使用者自己所產生的那些程序中,是否有 vim 程序。接下來,利用 kill 命令來刪除所產生的程序,操作範例如下:

$ kill -9 541

$ kill -9 542

$ ps -ef |grep tsnien|grep vim

tsnien     576 32726  0 16:05 pts/6    00:00:00 grep vim

$

上述範例中,kill 命令是刪除執行中的程序,其中 -9 是最高等級,表示程序無論在何種狀態下,都會被無條件刪除。使用者僅允許刪除自己所產生的程序,刪除後可利用 ps 命令觀察是否程序還存在。

(A) 【背景程序輸出】

背景程序執行完畢之後,如果有輸出的話,會由標準輸出顯示出來(如沒有另外指定轉向輸出的話),操作範例如下:

$ (sleep 4; echo Good Lucky to You)&

[1] 577

$ Good Lucky to You

                              Enter 輸入

[1]+  Done                    ( sleep 4; echo Good Lucky to You )

$

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: