首頁 > 軟體

RHEL7管道與重定向

2020-06-16 17:34:44

檔案描述符

可以理解為linux跟蹤開啟檔案,而分配的一個數位,這個數位有點類似C語言操作檔案時候的控制代碼,通過控制代碼就可以實現檔案的讀寫操作
使用者可以自定義檔案描述符範圍是:3-num,這個最大數位,跟使用者的:ulimit –n 定義數位有關係,不能超過最大值

檢視系統檔案描述符最大值

[root@localhost ~]# ulimit -n
1024

linux系統預設檔案描述符

檔案描述符用途POSIX名稱stdio流說明
0 標準輸入 STDIN_FILENO stdin 預設的裝置是鍵盤
命令將從標準輸入檔案中讀取
在執行過程中的需要的輸入資料
資料來源於檔案
1 標準輸出 STDOUT_FILENO stdout 預設的裝置是顯示器
命令執行後的輸出結果傳送到標準輸出檔案
結果輸出到檔案
2 標準錯誤 STDERR_FILENO stderr 預設的裝置是顯示器
命令將執行期間的各種錯誤資訊傳送到標準錯誤檔案
錯誤資訊傳送到檔案

標準輸入,標準輸出和標準錯誤預設使用鍵盤和顯示器作為關聯裝置與作業系統進行互動完成最基本的輸入,輸出操作

命令執行過程

重定向輸出

語法:命令 [檔案描述符] >或>> 檔案或檔案操作符或裝置
檢視當前目錄下的檔案

[root@WWW.LINUXIDC.COM ~]# ls
test.txt

檢視當前目錄下的test.txt檔案和一個不存在的test1.txt檔案

[root@WWW.LINUXIDC.COM ~]# ls test.txt test1.txt
ls: cannot access test1.txt: No such file or directory
test.txt

將正確的輸出重定向到檔案success.txt中

[root@WWW.LINUXIDC.COM ~]# ls test.txt test1.txt 1>success.txt
ls: cannot access test1.txt: No such file or directory
[root@WWW.LINUXIDC.COM ~]# cat success.txt
test.txt

將錯誤的輸出重定向到檔案error.txt中

[root@WWW.LINUXIDC.COM ~]# ls test.txt  test1.txt 2>error.txt
test.txt
[root@WWW.LINUXIDC.COM ~]# cat error.txt
ls: cannot access test1.txt: No such file or directory

&1:代系結到表標準輸出
&2:代表系結到標準錯誤輸出
&-:代表關閉與他繫結的檔案描述符
關閉標準錯誤輸出

[root@WWW.LINUXIDC.COM ~]# ls test.txt  test1.txt >success.txt 2>&-
[root@WWW.LINUXIDC.COM ~]# cat success.txt
test.txt

將標準錯誤輸出系結到標準輸出

[root@WWW.LINUXIDC.COM ~]# ls test.txt  test1.txt > all.txt 2>&1
[root@WWW.LINUXIDC.COM ~]# cat all.txt
ls: cannot access test1.txt: No such file or directory
test.txt

將標準錯誤輸出重定向到黑洞裝置

[root@WWW.LINUXIDC.COM ~]# ls test.txt  test1.txt 2>/dev/null
test.txt

&>:混合輸出(不分對錯)

[root@WWW.LINUXIDC.COM ~]# ls test.txt  test1.txt &> all.txt
[root@WWW.LINUXIDC.COM ~]# cat all.txt
ls: cannot access test1.txt: No such file or directory
test.txt

注意事項:

  1. shell遇到”>”操作符,會判斷右邊檔案是否存在,如果存在就先刪除,並且建立新檔案。不存在直接建立。 無論左邊命令執行是否成功。右邊檔案都會變為空
  2. “>>”操作符,判斷右邊檔案,如果不存在,先建立
    以新增方式開啟檔案,會分配一個檔案描述符[不特別指定,預設為1,2]然後,與左邊的標準輸出(1)或錯誤輸出(2) 係結
  3. 當命令:執行完,係結檔案的描述符也自動失效。0,1,2又會空閒
  4. 一條命令啟動,命令的輸入,正確輸出,錯誤輸出,預設分別系結0,1,2檔案描述符
  5. 一條命令在執行前,先會檢查輸出是否正確,如果輸出裝置錯誤,將不會進行命令執行

重定向輸入

將命令中接收輸入的途徑由預設的鍵盤改為其他檔案而不是等待從鍵盤輸入
通過重定向輸入可以使一些互動式操作過程能夠通過讀取檔案來完成

操作符: <
使用passwd設定密碼時,每次都根據提示輸入密碼比較煩瑣
改用重定向輸入將可以忽略互動式的過程而自動完成密碼設定
使用非互動式的去執行設定密碼

[root@WWW.LINUXIDC.COM ~]# touch passwd.txt
[root@WWW.LINUXIDC.COM ~]# echo 123456 > passwd.txt
[root@WWW.LINUXIDC.COM ~]# passwd test --stdin < passwd.txt
Changing password for user test.
passwd: all authentication tokens updated successfully.

管道

管道命令操作符是:”|”,它僅能處理經由前面一個指令傳出的正確輸出資訊
也就是 standard output 的資訊,對於 stdandard error 資訊沒有直接處理能力
然後,傳遞給下一個命令,作為標準的輸入 standard input


command1正確輸出,作為command2的輸入 然後comand2的輸出作為,comand3的輸入 ,comand3輸出就會直接顯示在螢幕上面了
通過管道之後:comand1,comand2的正確輸出不顯示在螢幕上面

  1. 管道命令只處理前一個命令正確輸出,不處理錯誤輸出
  2. 管道命令右邊命令,必須能夠接收標準輸入流命令才行
[root@WWW.LINUXIDC.COM ~]# ls -f | grep all
all.txt

管道與重定向的區別

  • 左邊的命令應該有標準輸出 | 右邊的命令應該接受標準輸入
  • 左邊的命令應該有標準輸出 > 右邊只能是檔案
  • 左邊的命令應該需要標准輸入 < 右邊只能是檔案
  • 管道觸發兩個子進程執行"|"兩邊的程式,而重定向是在一個進程內執行

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-08/134615.htm


IT145.com E-mail:sddin#qq.com