linux之資料流重定向

2021-09-02 02:42:02 字數 3043 閱讀 1332

stdin(標準輸入,對應於你在終端的輸入),stdout(標準輸出,對應於終端的輸出),stderr(標準錯誤輸出,對應於終端的輸出)。

檔案描述符	裝置檔案	說明

0 /dev/stdin 標準輸入

1 /dev/stdout 標準輸出

2 /dev/stderr 標準錯誤

檔案描述符:檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。但是檔案描述符這一概念往往只適用於 unix、linux 這樣的作業系統。

預設使用終端的標準輸入作為命令的輸入和標準輸出作為命令的輸出

將cat的連續輸出(heredoc方式)重定向到乙個檔案

$ mkdir documents

$ cat > documents/test.c eof

將乙個檔案作為命令的輸入,標準輸出作為命令的輸出

$ cat documents/test.c
將echo命令通過管道傳過來的資料作為cat命令的輸入,將標準輸出作為命令的輸出

$ echo 'hi' | cat
將echo命令的輸出從預設的標準輸出重定向到乙個普通檔案

$ echo 'hello shiyanlou' > redirect

$ cat redirect

標準錯誤重定向

重定向標準輸出到檔案,這是乙個很實用的操作,另乙個很實用的操作是將標準錯誤重定向,標準輸出和標準錯誤都被指向偽終端的螢幕顯示,所以我們經常看到的乙個命令的輸出通常是同時包含了標準輸出和標準錯誤的結果的

# 使用cat 命令同時讀取兩個檔案,其中乙個存在,另乙個不存在

$ cat documents/test.c hello.c

# 你可以看到除了正確輸出了前乙個檔案的內容,還在末尾出現了一條錯誤資訊

# 下面我們將輸出重定向到乙個檔案

$ cat documents/test.c hello.c > somefile

遺憾的是,這裡依然出現了那條錯誤資訊,這正是因為如我上面說的那樣,標準輸出和標準錯誤雖然都指向終端螢幕,實際它們並不一樣。那有的時候我們就是要隱藏某些錯誤或者警告

# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到檔案,注意要將重定向到檔案寫到前面

$ cat documents/test.c hello.c >somefile 2>&1

# 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到檔案

$ cat documents/test.c hello.c &>somefilehell

使用tree命令同時重定向到多個檔案

你可能還有這樣的需求,除了需要將輸出重定向到檔案,也需要將資訊列印在終端。那麼你可以使用tee命令來實現:

$ echo 'hello shiyanlou' | tee hello
永久重定向

你應該可以看出我們前面的重定向操作都只是臨時性的,即只對當前命令有效,那如何做到「永久」有效呢,比如在乙個指令碼中,你需要某一部分的命令的輸出全部進行重定向,難道要讓你在每個命令上面加上臨時重定向的操作嘛,當然不需要,我們可以使用exec命令實現「永久」重定向。exec命令的作用是使用指定的命令替換當前的 shell,即使用乙個程序替換當前程序,或者指定新的重定向:

# 先開啟乙個子 shell

$ zsh

# 使用exec替換當前程序的重定向,將標準輸出重定向到乙個檔案

$ exec 1>somefile

# 後面你執行的命令的輸出都將被重定向到檔案中,直到你退出當前子shell,或取消exec的重定向(後面將告訴你怎麼做)

$ ls

$ exit

$ cat somefile

在 shell 中有9個檔案描述符。上面我們使用了也是它預設提供的0,1,2號檔案描述符。另外我們還可以使用3-8的檔案描述符,只是它們預設沒有開啟而已。你可以使用下面命令檢視當前 shell 程序中開啟的檔案描述符:

$ cd /dev/fd/;ls -al
同樣使用exec命令可以建立新的檔案描述符:

$ zsh

$ exec 3>somefile

# 先進入目錄,再檢視,否則你可能不能得到正確的結果,然後再回到上一次的目錄

$ cd /dev/fd/;ls -al;cd -

# 注意下面的命令》與&之間不應該有空格,如果有空格則會出錯

$ echo "this is test" >&3

$ cat somefile

$ exit

關閉檔案描述符

$ exec 3>&-

$ cd /dev/fd;ls -al;cd -

在 linux 中有乙個被稱為「黑洞」的裝置檔案,所有匯入它的資料都將被「吞噬」。

在類 unix 系統中,/dev/null,或稱空裝置,是乙個特殊的裝置檔案

,它通常被用於丟棄不需要的輸出流,或作為用於輸入流的空檔案,

這些操作通常由重定向完成。讀取它則會立即得到乙個eof。

我們可以利用設個/dev/null遮蔽命令的輸出:

$ cat documents/test.c nefile 1>/dev/null 2>&1
這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文件。

$ cut -d: -f1 < /etc/passwd | sort | xargs echo
上面這個命令用於將/etc/passwd檔案按:分割取第乙個字段排序後,使用echo命令生成乙個列表。

Linux資料流重定向

開篇 當在執行shell命令時,常見的就是輸出在螢幕上,但是我們有些時候需要儲存輸出結果或者丟棄輸出錯誤,就需要重定向了。什麼是資料流重定向 當我們執行乙個命令 命令不也是程式嘛 可能由檔案或者鍵盤讀入資料,經過處理之後,再將結果輸出到螢幕上。圖中,standard output與standard ...

Linux資料流重定向

在我們日常linux命令操作中,命令執行的輸入一般是鍵盤輸入,輸出一般是輸出到螢幕,但有時候,我們可能會去讀取檔案裡但資料作為輸入,或者將輸出儲存到檔案裡 比如日誌檔案 這個時候就需要用到資料流重定向。所謂資料流重定向,就是 1 將某個命令執行後應該要出現在螢幕上的資料傳輸到其它地方,例如檔案或者諸...

Linux 資料流重定向

1.三種資料流重定向 1 標準輸入 stdin 為0,使用0 或0 2 標準輸出 stdout 為1,使用1 或1 其中 1可以省略 3 標準錯誤輸出 stderr 為2,使用2 或2 2.標準輸出 stdout 重定向 我們知道linux中,cat命令可以將檔案內容輸出到螢幕。如下所示 我們可以使...