天天看點

Linux Shell 的輸入與輸出

檔案描述符是與檔案輸入輸出相關聯的整數,他們用來跟蹤一打開的檔案,最常見的檔案描述符是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