文件描述符是與文件輸入、輸出相關聯的整數。它們用來跟蹤已打開的文件。最常見的文件
描述符是 stdin
、 stdout
和 stderr
。我們甚至可以將某個文件描述符的內容重定向到另一個文
件描述符中。
在編寫腳本的時候會頻繁使用標準輸入stdin
、標準輸出stdout
和標準錯誤
stderr
。通過內容過濾將輸出重定向到文件是我們平日裏的基本任務之一。當命令輸出文本
時,這些輸出文本有可能是錯誤信息,也可能是正常的(非錯誤的)輸出信息。單靠查看輸出的
文本本身,我們沒法區分哪些是正常,哪些是錯誤。不過可以通過文件描述符來解決這個問題,
將那些與特定描述符關聯的文本提取出來。
文件描述符是與某個打開的文件或數據流相關聯的整數。文件描述符 0
、 1
以及 2
是系統預留的。
0 —— stdin (標準輸入)
1 —— stdout (標準輸出)
2 —— stderr (標準錯誤)
實戰
-
通過截斷文件的方式,將輸出文本存儲到文件
temp.txt
中,寫入文件之前,temp.txt
中的內容首先會被清空。echo "This is a sample text 1" > temp.txt
-
將文本追加到目標文件中
echo "This is sample text 2" >> temp.txt
-
將
stdout
輸入文件中,stderr
打印到屏幕上cmd > out.txt
-
將
stderr
輸入文件中,stdout
打印到屏幕上cmd 2> out.txt
-
將
stderr
單獨重定向到一個文件,將stdout
重定向到另一個文件cmd 2>stderr.txt 1>stdout.txt
-
將
stderr
轉換成stdout
,使得stderr
和stdout
都被重定向到同一個文件中cmd 2>&1 output.txt cmd &> output.txt
-
既可以將數據重定向到文件,還可以提供一份重定向數據的副本作爲後續命令的
stdin
。# tee 只能從`stdin`中讀取 cat a* | tee out.txt | cat -n
- tee命令
在輸出信息的同時把信息記錄到文件中ls | tee ls.txt
將會在終端上顯示ls命令的執行結果,並把執行結果輸出到ls.txt
文件中,將會覆蓋原文件的內容,若無ls.txt
文件,將會自動創建該文件ls | tee -a ls.txt
保留ls.txt
文件中原來的內容,並把ls命令的執行結果追加到ls.txt
文件的最後,不覆蓋原來的內容ls | tee file1.txt file2.txt
- tee命令
補充
-
將文件重定向到命令
# cmd <file bash <(curl -s https://gitee.com/yw007/codes/6v34iz57ruhtdx1scq9fa100/raw?blob_name=hello_world.sh)
-
將腳本內部的文本塊進行重定向
有時候,我們需要對文本塊(多行文本)進行重定向,就像對標準輸入做的那樣。考慮一個
特殊情況:源文本就位於shell腳本中。一個實用的例子是向log文件中寫入頭部數據,可以按照下
面的方法完成:#!/bin/bash cat<<EOF>log.txt LOG FILE HEADER This is a test log file Function: System statistics EOF