網站首頁 編程語言 正文
1.輸入輸出重定向介紹
重定向簡單來說就是把本來已經默認的、確定的輸入輸出給重新定位到你想要的地方。 重定向這個概念在C語言中就有,在C語言編程中,標準輸出是屏幕,使用printf()函數默認是輸出到屏幕顯示。但是有時候我們需要將信息輸出到文件或者申請的內存中,這時候就可以用sprintf()和fprintf()函數;也可以
將標準輸出的文件描述符給強行占用,使標準輸出的文件描述符指向自己想要的文件。在shell中默認打開了三個文件,分別是標準輸出(文件描述符0)、標準輸出(文件描述符1)、錯誤輸出(文件描述符2),標準輸入默認是鍵盤,標準輸出和錯誤輸出默認是屏幕。
2.>和>>介紹
解析:>和>>都是重定向的符號,符號的左邊表示文件描述符或者要重定位的內容,如果不寫默認是文件描述符1,即標準輸出;右邊可以是文件也可以是設備。
1.當使用>時,如果右邊的文件存在則會先刪除在創建,如果右邊的文件不存在則創建;
2.當使用>>時,表示追加,右邊的文件不會被刪除,新的內容會添加到文件的末尾。
3.命令:>/dev/null 2>&1
解析:這可以理解成兩句指令:>/dev/null 和 2>&1
(1)>/dev/null :將文件描述符1重定向到/dev/null,文件描述符1是標準輸出,/dev/null在linux中是空的設備文件,所以往這個設備文件輸入的內容都會丟失;這句指令的作用就是將標準輸出重定向到/dev/null這個空的設備文件里,效果就是全部的輸出都會丟掉。
(2)2>&1:將文件描述符2重定向到文件描述符1指向的地方,也就是空的設備文件。執行該指令后,標準輸出和錯誤輸出都往空設備文件里寫,效果就是兩者都丟不再打印到屏幕。
4.命令:2>&1 >/dev/null
解析:同樣分成兩個語句理解、
(1)2>&1:將文件描述符2重定向到文件描述符1指向的地方,此時標準輸出是屏幕。該指令的效果是標準輸出和錯誤輸出都輸出到屏幕。
(2)>/dev/null:將標準輸出重定向到空的設備文件,即屏幕不再打印標準輸出;但是錯誤輸出此時還是會往屏幕輸出,因為錯誤輸出并沒有重定向到空的設備文件。
5.總結:
(1)**>/dev/null 2>&1:**標準輸出和錯誤輸出都舍棄掉;
(2)**2>&1 >/dev/null:**標準輸出被舍棄掉,錯誤輸出被重定位到屏幕;
在Linux下,當一個用戶進程被創建的時候,系統會自動為該進程創建三個數據流即stdin stdout stderr。在shell里面,分別用0,1,2代表stdin stdout stderr。
stdin默認從鍵盤接收輸入,而stdout和stderr默認向console輸出。
示例1
echo默認將hello送到stdout顯示。而"|"管道符接收來自stdout的輸入?。所以echo hello的結果被送到grep處理,最終顯示hello。
示例2
echo hello本來是要把hello輸出到stdout,但是由于1>&2的作用,最終hello交給了stderr。其實stderr也是在console上顯示,所以輸出結果是hello。但是管道符|只收到stdout,收不到stderr的數據,所以hello傳不到grep,最終只通過stderr打印hello。
再舉一個從stderr向stdout定向的示例3
ls 查找一個并不存在的文件,將打印錯誤信息
?將ls c.cpp與 grep cpp連用,打印相同的信息。但是這是出錯信息,通過stderr輸出的,而管道符只接受stdout的輸出所以grep不處理信息,打印出來的cpp字符串也不標紅。
只有把stderr重定向到stdout---2>&1,才能讓grep起作用,看到標紅的cpp。
示例4
?echo hello產生hello并輸出到stdout。同時2>&1將錯誤信息也交給stdout。但是echo hello并無錯誤信息,所以最后stdout的內容就是hello,并由grep處理,產生標紅的hello。
示例5
使用1>2重定向,注意這里不是&2。此時重定向的目的不再是stderr,而是文件2.假如2文件不存在,則shell將創建一個,并將hello輸入到文件里。管道符還是不能從stdout那里得到數據,所以控制臺不打印。
示例6 也可以用<來定向stdin
文件2的內容是hello。可以用<2 或者0<2實現重定向。至于grep h 2,也是可以的--grep也接收文件名作為輸入參數。只有最后一種操作返回不了理想的結果--grep h &0<2
原文鏈接:https://blog.csdn.net/liji_digital/article/details/127511288
相關推薦
- 2022-04-22 C#基于WinForm實現串口通訊_C#教程
- 2022-09-08 Pandas?計算相關性系數corr()方式_python
- 2022-06-17 docker上快速搭建gitlab、gitlab-runer及實現CI/CD功能_docker
- 2022-12-03 Sql?Server中通過sql命令獲取cpu占用及產生鎖的sql_MsSql
- 2023-03-22 React使用高階組件與Hooks實現權限攔截教程詳細分析_React
- 2023-02-09 go?slice?數組和切片使用區別示例解析_Golang
- 2022-10-08 C#中LINQ的Select與SelectMany函數使用_C#教程
- 2022-06-29 pytorch部署到jupyter中的問題及解決方案_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支