[[email protected] ~]$ echo "c.biancheng.net" > log.txt [[email protected] ~]$ echo "C語言中文網" C語言中文網 [[email protected] ~]$ cat log.txt c.biancheng.net第一個 echo 命令使用了重定向,將內容輸出到 log.txt 檔案;第二個 echo 命令沒有再次使用重定向,內容就直接輸出到顯示器上了。很明顯,重定向只對第一個 echo 有效,對第二個 echo 無效。
exec 檔案描述符操作
在《結合Linux檔案描述符談重定向,徹底理解重定向的本質》一節講到的所有對檔案描述符的操作方式 exec 都支援,請看下面的例子:[[email protected] ~]$ echo "重定向未發生" 重定向未發生 [[email protected] ~]$ exec >log.txt [[email protected] ~]$ echo "c.biancheng.net" [[email protected] ~]$ echo "C語言中文網" [[email protected] ~]$ exec >&2 [[email protected] ~]$ echo "重定向已恢復" 重定向已恢復 [[email protected] ~]$ cat log.txt c.biancheng.net C語言中文網對程式碼的說明:
exec >log.txt
將當前 Shell 進程的所有標準輸出重定向到 log.txt 檔案,它等價於exec 1>log.txt
。exec >&2
用來恢復重定向,讓標準輸出重新回到顯示器,它等價於exec 1>&2
。2 是標準錯誤輸出的檔案描述符,它也是輸出到顯示器,並且沒有遭到破壞,我們用 2 來覆蓋 1,就能修復 1,讓 1 重新指向顯示器。exec >&2
奏效了。#!/bin/bash exec 6<&0 #先將0號檔案描述符儲存 exec <nums.txt #輸入重定向 sum=0 while read n; do ((sum += n)) done echo "sum=$sum" exec 0<&6 6<&- #恢復輸入重定向,並關閉檔案描述符6 read -p "請輸入名字、網址和年齡:" name url age echo "$name已經$age歲了,它的網址是 $url"將程式碼儲存到 test.txt,並執行下面的命令:
[[email protected] ~]$ cat nums.txt 80 33 129 71 100 222 8 [[email protected] ~]$ bash ./test.sh sum=643 請輸入名字、網址和年齡:C語言中文網 http://c.biancheng.net 7 C語言中文網已經7歲了,它的網址是 http://c.biancheng.net