Shell教程十一 Shell 輸入 輸出重定向

2021-08-21 09:56:48 字數 4568 閱讀 6352

大多數 unix 系統命令從你的終端接受輸入並將所產生的輸出傳送回​​到您的終端。乙個命令通常從乙個叫標準輸入的地方讀取輸入,預設情況下,這恰好是你的終端。同樣,乙個命令通常將其輸出寫入到標準輸出,預設情況下,這也是你的終端。

重定向命令列表如下:

命令說明

command > file

將輸出重定向到 file。

command < file

將輸入重定向到 file。

command >> file

將輸出以追加的方式重定向到 file。

n > file

將檔案描述符為 n 的檔案重定向到 file。

n >> file

將檔案描述符為 n 的檔案以追加的方式重定向到 file。

n >& m

將輸出檔案 m 和 n 合併。

n <& m

將輸入檔案 m 和 n 合併。

<< tag

將開始標記 tag 和結束標記 tag 之間的內容作為輸入。

需要注意的是檔案描述符 0 通常是標準輸入(stdin),1 是標準輸出(stdout),2 是標準錯誤輸出(stderr)。

重定向一般通過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示:

command1 

>

file1

上面這個命令執行command1然後將輸出的內容存入file1。

注意任何file1內的已經存在的內容將被新內容替代。如果要將新內容新增在檔案末尾,請使用》操作符。

執行下面的 who 命令,它將命令的完整的輸出重定向在使用者檔案中(users):

$ who 

>

users

執行後,並沒有在終端輸出資訊,這是因為輸出已被從預設的標準輸出裝置(終端)重定向到指定的檔案。

你可以使用 cat 命令檢視檔案內容:

$ cat users

_mbsetupuser console

oct3117:

35tianqixin console

oct3117:

35tianqixin ttys000

dec111:

33

輸出重定向會覆蓋檔案內容,請看下面的例子:

$ echo 

"我是herb"

>

users

$ cat users

我是herb

$

如果不希望檔案內容被覆蓋,可以使用 >> 追加到檔案末尾,例如:

$ echo 

"i'm herb"

>>

users

$ cat users

i'm herb

i'm herb

$

和輸出重定向一樣,unix 命令也可以從檔案獲取輸入,語法為:

command1 

<

file1

這樣,本來需要從鍵盤獲取輸入的命令會轉移到檔案讀取內容。

注意:輸出重定向是大於號(>),輸入重定向是小於號(<)。

接著以上例項,我們需要統計 users 檔案的行數,執行以下命令:

$ wc 

-l users

2users

也可以將輸入重定向到 users 檔案:

$  wc -l 

<

users

2

注意:上面兩個例子的結果不同:第乙個例子,會輸出檔名;第二個不會,因為它僅僅知道從標準輸入讀取內容。

command1 

<

infile

>

outfile

同時替換輸入和輸出,執行command1,從檔案infile讀取內容,然後將輸出寫入到outfile中。

一般情況下,每個 unix/linux 命令執行時都會開啟三個檔案:

預設情況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以這樣寫:

$ command 

2>

file

如果希望 stderr 追加到 file 檔案末尾,可以這樣寫:

$ command 

2>>

file

2表示標準錯誤檔案(stderr)。

如果希望將 stdout 和 stderr 合併後重定向到 file,可以這樣寫:

$ command 

>

file

2>&1或者

$ command

>>

file

2>&

1

如果希望對 stdin 和 stdout 都重定向,可以這樣寫:

$ command 

<

file1

>

file2

command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。

here document 是 shell 中的一種特殊的重定向方式,用來將輸入重定向到乙個互動式 shell 指令碼或程式。

它的基本的形式如下:

command 

<<

delimiter

document

delimiter

它的作用是將兩個 delimiter 之間的內容(document) 作為輸入傳遞給 command。

注意:

在命令列中通過 wc -l 命令計算 here document 的行數:

$ wc -l 

<<

eof

歡迎來到

herb筆記

# 輸出結果為 3 行

$

如果希望執行某個命令,但又不希望在螢幕上顯示輸出結果,那麼可以將輸出重定向到 /dev/null:

$ command 

>

/dev/

null

/dev/null 是乙個特殊的檔案,寫入到它的內容都會被丟棄;如果嘗試從該檔案讀取內容,那麼什麼也讀不到。但是 /dev/null 檔案非常有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。

如果希望遮蔽 stdout 和 stderr,可以這樣寫:

$ command 

>

/dev/

null

2>&

1

注意:0 是標準輸入(stdin),1 是標準輸出(stdout),2 是標準錯誤輸出(stderr)。

參考位址

$ command 

>

file

2>&

1$ command

>>

file

2>&

1

這裡的&沒有固定的意思

放在》後面的&,表示重定向的目標不是乙個檔案,而是乙個檔案描述符,內建的檔案描述符如下

1

=>

stdout

2=>

stderr

0=>

stdin

換言之 2>1 代表將stderr重定向到當前路徑下檔名為1的regular file中,而2>&1代表將stderr重定向到檔案描述符為1的檔案(即/dev/stdout)中,這個檔案就是stdout在file system中的對映

而&>file是一種特殊的用法,也可以寫成》&file,二者的意思完全相同,都等價於

>

file

2>&

1

此處&>或者》&視作整體,分開沒有單獨的含義

順序問題:

find 

/etc

-name

.bashrc

>

list

2>&

1# 我想問為什麼不能調下順序,比如這樣

find

/etc

-name

.bashrc

2>&

1>

list

這個是從左到右有順序的

第一種

*** 

>

list

2>&

1

先將要輸出到stdout的內容重定向到檔案,此時檔案list就是這個程式的stdout,再將stderr重定向到stdout,也就是檔案list

第二種

*** 

2>&

1>

list

先將要輸出到stderr的內容重定向到stdout,此時會產生乙個stdout的拷貝,作為程式的stderr,而程式原本要輸出到stdout的內容,依然是對接在stdout原身上的,因此第二步重定向stdout,對stdout的拷貝不產生任何影響

Shell教程一 Shell教程

開啟文字編輯器 可以使用 vi vim 命令來建立檔案 新建乙個檔案 test.sh,擴充套件名為 sh sh代表shell 副檔名並不影響指令碼執行,見名知意就好,如果你用 php 寫 shell 指令碼,副檔名就用 php 好了 bin bash echo hello world 是乙個約定的標...

Shell教程 Shell 傳遞引數

我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推 以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 0為執行的檔名 bin bash author 菜鳥教程 url www.r...

shell學習十一 bc

bc 獨有特點既包含整數,也包含小數 bc是一種任意精度的計算語言,注意是一種語言,它提供了一些語法結構,比如條件判斷 迴圈等,可以說是很強大的,但是我在實際中還沒有找到 需要這個用途的場合 另外乙個用途就是用來進行進製轉換。引數 i 強制互動模式 l 使用bc的內建庫,bc裡有一些數學庫,對三角計...