檔案描述符是與檔案輸入輸出相關聯的整數,他們用來跟蹤一打開的檔案,最常見的檔案描述符是stdin,stdout和stderr。
我們在編寫腳本的時候會使用輸入輸出,當然也肯定會有錯誤。但是我們無法僅靠輸出文本,是無法判斷那些是正常文本,那些是錯誤文本。是以我們通過檔案描述符來解決這個問題。
檔案描述符:
0——stdin 标準輸入
1——stdout 标準輸出
2——stderr 标準錯誤
首先,我們看看如何輸出:
echo "輸出一些文本到" > target.txt
這種輸出會把target.txt檔案清空。
如果希望将輸出追加到檔案中,可以使用:
echo "再輸出一些文本到" >> target.txt
可以使用cat來檢視檔案:
cat target.txt
當使用重定向操作符(> 或者 >> )時,内容不會出現在shell,而是直接輸入到檔案中,這時重定向操作符都是用了預設的檔案描述符1,如果要使用其他描述符,要把描述符放在操作符之前。
舉個例子:
ls 不存在的檔案 > out.txt
這樣會顯示:
ls: 不存在的檔案: No such file or directory
這時候标準錯誤并沒有被輸入到檔案中,因為我們的預設描述符是1,是以也隻有标準輸出會輸出到檔案中。
如果我們這時候用:
ls 不存在的檔案 2> out.txt
這時候stderr就不會顯示在shell中,而是輸出到了檔案中。
我們可以将多個指令組合,通過管道pipe來連接配接每個過濾器filter,管道操作符是“|”。
例如:
$ ls | cat -n > out.txt
cat會接受ls指令輸出的内容,加上-n參數,就會加上行号,然後通過stdout輸出到檔案。
我們也可以通過小括号()操作符來生成一個子程序subshell,再加上一個$,就可以把輸出指派給一個變量。
output=$(ls | cat -n)
指令在subshell中執行的時候,不會對目前的shell有任何影響。
不過我們使用subshell把輸出指派給一個變量的時候,會丢失空格和換行符,如果需要保留,可以把變量放到雙引号中。
out="$(cat ouot.txt)"
echo $out