Shell重定向與exec

2022-06-03 23:54:14 字數 3323 閱讀 7379

首先我們需要知道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作為stdout

exec

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...