首先我們需要知道exec是什麼,exec是linux下面乙個建立程序的方法,詳情請參考:
fd說明
0stdin,標準輸入
1stdout,標準輸出
2stderr,標準錯誤輸出
檢視檔案描述符
ll /proc/$$/fd
&-關閉標準輸出n&-表示將 n 號輸出關閉
述所有形式都可以前導乙個數字,此時建立的檔案描述符由這個數字指定而不是預設的
0 或 1
。如:...
2>file 執行乙個命令並把錯誤輸出(檔案描述符 2)定向到 file
。...
2>&1 執行乙個命令並把它的標準輸出和輸出合併。(嚴格的說是通過複製檔案描述符 1 來建立檔案描述符 2
,但效果通常是合併了兩個流。)
我們對
2>&1詳細說明一下 :
2>&1 也就是 fd2=fd1 ,這裡並不是說fd2 的值等於fd1的值,因為 >是改變送出的資料通道,也就是說把 fd2 的 「資料輸出通道」 改為 fd1 的 「資料輸出通道」。
如果僅僅這樣,這個改變好像沒有什麼作用,因為 fd2 的預設輸出和 fd1 的預設輸出本來都是 monitor,一樣的!但是,當 fd1 是其他檔案,甚至是其他 fd 時,這個就具有特殊的用途了。請大家務必理解這一點。
如果 stdin, stdout, stderr 進行了重定向或關閉, 但沒有儲存原來的 fd, 可以將其恢復到 default 狀態嗎?
如果關閉了stdin,因為會導致退出,那肯定不能恢復。
如果重定向或關閉 stdout和stderr其中之一,可以恢復,因為他們預設均是送往monitor(但不知會否有其他影響)。
如果恢復重定向或關閉的 stdout:exec 1>&2
,恢復重定向或關閉的stderr:exec 2>&1
。
如果stdout和stderr全部都關閉了,又沒有儲存原來的fd,可以用:exec 1>/dev/tty
恢復。
cmd >a 2>a 和 cmd >a 2>&1 為什麼不同?
cmd >a 2>a 相當於使用了兩個互相競爭使用檔案a的管道;
而cmd >a 2>&1 只使用了乙個管道,但在其源頭已經包括了stdout和stderr。
從io效率上來講,cmd >a 2>&1的效率應該更高!
exec 1>outfilename # 開啟檔案outfilename作為stdoutexec
2>errfilename # 開啟檔案errfilename作為 stderr
exec
1&-# 關閉 fd1
exec
5>&-# 關閉 fd5
exec
4<&1
# 備份當前stdout至fd4
exec
1>1
.txt # stdout重定向至1.txt
exec
1<&4
# 恢復stdout
exec
4>&-# 關閉 fd4
exec
6>&1
# 將標準輸出與fd 6繫結
exec
1>&6 # 將標準輸出1恢復回來
示例
exec 1>&- 2>&- # 關閉所有的輸出
格式
command-line [n]將命令預設從鍵盤獲得的輸入,改成從檔案,或者其它開啟檔案以及裝置輸入。執行這個命令,將標準輸入0,與檔案或裝置繫結。將由它進行輸入。示例例項一:用catfile檔案裡面的內容代替鍵盤輸出,輸出到螢幕。
[root@asus-a53s data]# cp
suc.test catfile
[root@asus-a53s data]# cat
ls #這裡如果內容過多,按下 [ctrl]+d 離開
[root@asus-a53s data]# cat
suc.test
ls例項二:從標準輸入【鍵盤】獲得資料,然後輸出給catfile檔案
[root@asus-a53s data]# cat > catfile <> hello,this is my test!
>eof
[root@asus-a53s data]# cat
catfile #上面用的是重定向覆蓋,所以ls內容不見了
hello,this is my test!例項三:從test.
sh獲得輸入資料,然後輸出給檔案catfile
[root@asus-a53s data]# cat test.sh
1test1
test1
test1
[root@asus-a53s data]# cat > catfile < test.sh #這裡在輸入的時候不能用<<,因為《同時是也代表結束輸出
[root@asus-a53s data]# cat
catfile
1test1
test1
test1
格式
exec 檔案描述符[n] 《或》file或檔案描述符或裝置
在上面講的輸入,輸出重定向 將輸入,輸出繫結檔案或裝置後。只對當前那條指令是有效的。如果需要在繫結之後,接下來的所有命令都支援的話。就需要用exec命令
示例
例項一:學習exec的繫結使用[chengmo@centos5 shell]$ exec
6>&1
#將標準輸出與fd 6繫結
[chengmo@centos5 shell]$
ls /proc/self/fd/ 01
236#出現檔案描述符6
[chengmo@centos5 shell]$ exec
1>suc.txt
#將接下來所有命令標準輸出,繫結到suc.txt檔案(輸出到該檔案)
[chengmo@centos5 shell]$
ls -al
#執行命令,發現什麼都不返回了,因為標準輸出已經輸出到suc.txt檔案了
[chengmo@centos5 shell]$ exec
1>&6
#恢復標準輸出
[chengmo@centos5 shell]$ exec
6>&-#關閉fd 6描述符
[chengmo@centos5 ~]$ ls /proc/self/fd/12
3
Linux重定向與shell變數
4種執行bash的命令方法 先執行 父 的bash小,後執行的 子 bash大 2 bas 件名 父子bash 3 bash bas 件名 父子bash,bash bash 命令在第二個bash 子 中執行 4 chmod x bas 件名 將變為可執行檔案,將檔案變成可執行檔案 bas 件名 父子...
shell重定向輸入
這條命令的作用是將標準輸出1重定向到 dev null中。dev null代表linux的空裝置檔案,所有往這個檔案裡面寫入的內容都會丟失,俗稱 黑洞 那麼執行了 dev null之後,標準輸出就會不再存在,沒有任何地方能夠找到輸出的內容。錯誤輸出將會和標準輸出輸出到同乙個地方,linux在執行sh...
Bash內建命令exec和重定向
bash內建命令exec重定向 bash內建命令exec可以替換當前程式而不需要啟動乙個新的程序,可以改變標準輸入和輸出而不需要啟動乙個新的子程序。如果檔案用exec開啟,read命令就會把檔案指標每次指向下一行直到檔案的末尾,如果要重新從檔案開始讀取,則必須把檔案關閉再重新開啟。1 替換當前she...