文件描述符 可以理解為linux跟蹤打開文件,而分配的一個數字,這個數字有點類似c語言操作文件時候的句柄,通過句柄就可以實現文件的讀寫操作 用戶可以自定義文件描述符範圍是:3 num,這個最大數字,跟用戶的:ulimit –n 定義數字有關係,不能超過最大值 查看系統文件描述符最大值 linux系統 ...
文件描述符
可以理解為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@VM_200_13_centos ~]# ls
test.txt
查看當前目錄下的test.txt文件和一個不存在的test1.txt文件
[root@VM_200_13_centos ~]# ls test.txt test1.txt
ls: cannot access test1.txt: No such file or directory
test.txt
將正確的輸出重定向到文件success.txt中
[root@VM_200_13_centos ~]# ls test.txt test1.txt 1>success.txt
ls: cannot access test1.txt: No such file or directory
[root@VM_200_13_centos ~]# cat success.txt
test.txt
將錯誤的輸出重定向到文件error.txt中
[root@VM_200_13_centos ~]# ls test.txt test1.txt 2>error.txt
test.txt
[root@VM_200_13_centos ~]# cat error.txt
ls: cannot access test1.txt: No such file or directory
&1:代綁定到表標準輸出
&2:代表綁定到標準錯誤輸出
&-:代表關閉與他綁定的文件描述符
關閉標準錯誤輸出
[root@VM_200_13_centos ~]# ls test.txt test1.txt >success.txt 2>&-
[root@VM_200_13_centos ~]# cat success.txt
test.txt
將標準錯誤輸出綁定到標準輸出
[root@VM_200_13_centos ~]# ls test.txt test1.txt > all.txt 2>&1
[root@VM_200_13_centos ~]# cat all.txt
ls: cannot access test1.txt: No such file or directory
test.txt
將標準錯誤輸出重定向到黑洞設備
[root@VM_200_13_centos ~]# ls test.txt test1.txt 2>/dev/null
test.txt
&>:混合輸出(不分對錯)
[root@VM_200_13_centos ~]# ls test.txt test1.txt &> all.txt
[root@VM_200_13_centos ~]# cat all.txt
ls: cannot access test1.txt: No such file or directory
test.txt
註意事項:
- shell遇到”>”操作符,會判斷右邊文件是否存在,如果存在就先刪除,並且創建新文件。不存在直接創建。 無論左邊命令執行是否成功。右邊文件都會變為空
- “>>”操作符,判斷右邊文件,如果不存在,先創建
以添加方式打開文件,會分配一個文件描述符[不特別指定,預設為1,2]然後,與左邊的標準輸出(1)或錯誤輸出(2) 綁定 - 當命令:執行完,綁定文件的描述符也自動失效。0,1,2又會空閑
- 一條命令啟動,命令的輸入,正確輸出,錯誤輸出,預設分別綁定0,1,2文件描述符
- 一條命令在執行前,先會檢查輸出是否正確,如果輸出設備錯誤,將不會進行命令執行
重定向輸入
將命令中接收輸入的途徑由預設的鍵盤改為其他文件而不是等待從鍵盤輸入
通過重定向輸入可以使一些互動式操作過程能夠通過讀取文件來完成
操作符: <
使用passwd設置密碼時,每次都根據提示輸入密碼比較煩瑣
改用重定向輸入將可以忽略互動式的過程而自動完成密碼設置
使用非互動式的去執行設置密碼
[root@VM_200_13_centos ~]# touch passwd.txt
[root@VM_200_13_centos ~]# echo 123456 > passwd.txt
[root@VM_200_13_centos ~]# 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的正確輸出不顯示在屏幕上面
- 管道命令只處理前一個命令正確輸出,不處理錯誤輸出
- 管道命令右邊命令,必須能夠接收標準輸入流命令才行
[root@VM_200_13_centos ~]# ls -f | grep all
all.txt
管道與重定向的區別
- 左邊的命令應該有標準輸出 | 右邊的命令應該接受標準輸入
- 左邊的命令應該有標準輸出 > 右邊只能是文件
- 左邊的命令應該需要標準輸入 < 右邊只能是文件
- 管道觸發兩個子進程執行"|"兩邊的程式,而重定向是在一個進程內執行