#### 重定向
最常見的標準輸入(stdin)、標準輸出(stdout)和標準錯誤輸出(stderr)的文件描述符分別是0、1和2,其中0、1、2也可以認為是它們的數字代號。對于輸出信息,可以認為是打印在屏幕上的信息,而沒給出錯誤的就是標準輸出,給出錯誤提示的是標準錯誤輸出,當然這樣說明有失偏頗,但是易于理解。還可以自定義自己的描述符,實現高級重定向,在以后的文章中可能會介紹一下它們的用法。
> 標準輸入 = /dev/stdin = 代號0 = <符號(注意,沒有包含<<符號)。
>
> 標準輸出 = /dev/stdout = 代號1 = >或>>符號。
>
> 標準錯誤輸出 = /dev/stderr = 代號2 = 使用2>或2>>符號。
注意,上面的/dev/std{in,out,err}分別是0、1、2**默認的輸出目標,當重定向后,就不再使用這些目標**。具體見后文。
、2>實現的是覆蓋功能,>>、2>>實現的是追加的功能,但是注意"<<"不是追加功能,而是表示此處生成文檔(here document),在后面cat和重定向配合的內容里有說明。此外,還有<<<,它表示此處字符串(here string),也見下文。
有時候,使用"-"也表示/dev/stdin。如:
~~~
[root@xuexi ~]# cat /etc/fstab | cat -
~~~
**腳本中常見2>&1和&>以及&>>的符號,它們都表示將stdout和stderr都重定向到同一個地方去,即重定向所有輸出內容**。如最常見的"&> /dev/null"。
**注意:**
**(1).重定向操作是shell最先解析到的,在執行命令之前,重定向就會先打開文件以確定輸入、輸出的位置。如果是重定向輸出操作,則先截斷文件使其為空。**
**(2)./dev/stdin、/dev/stdout、/dev/stderr等設備只是數據默認的流向目標(嚴格地說是文件描述符0、1、2的輸出目標),它們不等價于"標準輸入0、標準輸出1、標準錯誤2"。之所以稱為"重定向",就是將數據的流向改變,不再輸入到這些默認設備中。**
**(3).重定向的順序很重要。**
例如 **ls / >file1 2>&1** 表示先打開file1作為標準輸出(fd=1)的目的地,然后再將標準錯誤綁定到標準輸出(已經是file1)上,這樣無論是標準錯誤還是標準輸出都重定向到file1中。它等價于 **ls / &>file1** 。"&"符號表示描述符重用(fd 2 duplicate from fd 1),有些人將其翻譯為文件描述符的復制, 2>&1 翻譯為標準錯誤是標準輸出的復制、副本,這樣的翻譯非常容易產生誤解,且很難結合已有知識去理解清楚。關鍵是很多書上就是這么解釋的,讓人費解,誤導一大片人以為這是高級重定向。**直接將其理解為文件描述符2綁定到文件描述符1上,或者文件描述2重用文件描述符1即可。**
**而 ls / 2>&1 >file1 表示先將標準錯誤綁定到標準輸出,此時標準輸出還是/dev/sdtout(即屏幕),因此標準錯誤的輸出目標是/dev/stdout(屏幕)。之后再打開file1作為標準輸出的目標。因此,它最終將標準錯誤重定向到/dev/stdout,將標準輸出重定向到file1。可以讓ls命令產生錯誤來測試, ls dlfjasl 2>&1 >file1 ,結果將直接顯示在屏幕上**。
..
## cat和重定向配合
配合cat使用可以分行輸入內容到文件中。
~~~
[root@xuexi tmp]# cat <<eof>log.txt ? # 覆蓋的方式輸入到log.txt
> this is stdin character
> eof
~~~
也可以使用下面的方法。
~~~
[root@xuexi tmp]# cat >log1.txt <<eof
> this is stdin character first!
> eof
~~~
一方面,eof部分都必須使用"<<eof",**它表示here document,此后輸入的內容都作為一個document輸入給cat。既然是document,那就肯定有document結束符標記document到此結束,結束符使用的是here document后的字符,**例如此處為eof。其實不使用eof,使用其他字符也是一樣的,但document的結束符也必須要隨之改變。如:
~~~
[root@xuexi ~]# cat <<abcx
> 123
> 345
> abcx
123
345
~~~
另一方面,>log1.txt表示將document的內容覆蓋到log1.txt文件中,如果是要追加,則使用>>log1.txt。所以,追加的方式如下:
~~~
[root@xuexi tmp]# cat >>log1.txt <<eof
> this is stdin character first!
> eof
~~~
或
~~~
[root@xuexi tmp]# cat <<eof>>log1.txt
> this is stdin character first!
> eof
~~~
- Linux
- linux常用命令
- awk
- cp
- scp
- mv
- screen工具
- rsync
- Linux設置靜態IP
- vim常用
- ssh免密登錄
- linux掛載磁盤和開機自動掛載
- 文件的時間戳
- 重定向
- 防火墻
- Vultr 服務器利用快照更換IP
- ss
- node-yarn
- ES安裝向導
- lnmp/lamp
- windows安裝mysql
- windows安裝nginx
- Let'sEncrypt 免費通配符/泛域名SSL證書
- 開機自動掛載硬盤
- 普通用戶提權
- ELK日志分析系統
- Docker
- docker
- centos7安裝docker
- Centos7安裝redis
- CentOS 7 使用Docker搭建Nginx
- CentOS 7 使用Docker搭建Jenkins
- CentOS 7 使用Docker搭建Zookeeper
- CentOS 7 使用Docker搭建Tomcat
- CentOS 7 使用Docker搭建Mysql
- CentOS 7 使用Docker搭建PHP環境
- 使用docker搭建Swagger
- docker阿里云私有倉庫
- docker zookeeper集群
- docker部署ES
- docker之java容器運行外置springboot-jar
- docker部署owncloud云盤
- ETCD
- centos7部署etcd節點
- Dockerfile
- Docker-compose
- gitlab.yml
- db.yml
- 安裝docker-compose
- gitlab-docker-compose.yml
- nginx-docker-compose.yml
- Mysql
- mysql開啟遠程訪問及相關權限控制
- mysql授權
- mysql快速導出導入大數據
- mysql單機備份
- binlog日志
- shell
- 經典案例
- 俄羅斯方塊游戲
- 系統初始化
- 服務器監控
- go基礎環境
- shell.監控日志.elk
- shell.檢查各服務腳本
- shell.刪除文件腳本
- shell.守護進程
- shell.數據庫
- shell.Ansible
- shell.dev
- shell.ftp環境
- shell.docker環境
- shell.k8s環境
- k8s.二進制安裝
- K8s.一主多從
- k8s.三主兩從高可用
- k8s.檢查服務與配置
- k8s.jenkins
- k8s.gitlab
- go-install.sh
- jenkins-install.sh
- node-install.sh
- redis-install.sh
- zabbix-install.sh
- zabbix-dockerfile.sh
- nginx-install.sh
- shell變量
- 用戶自定義變量
- 環境變量
- shell特殊變量
- shell條件判斷
- 流程控制
- shell運算符
- Shell _printf
- shell_test
- shell函數
- 輸出重定向
- 網絡相關
- 安全相關
- 堡壘機部署
- 區塊鏈威脅情報共享平臺
- 簽名與驗簽
- 淺談區塊鏈
- 智能合約
- 黃金幣GTF智能合約
- 節點
- 以太坊公鏈私鏈geth同步
- 比特節點同步
- BTC節點錯誤解決方法
- eth硬分叉
- omni錢包節點搭建
- 架構
- K8s
- 搭建k8s集群完整篇
- 二進制部署k8s
- Devops
- git
- Jenkins
- svn
- 禪道
- CI/CD
- docker+jenkins+golang持續集成持續交付(CI/CD)
- 項目部署
- config.env
- docker-compose.yml
- Dockerfile模板
- .dockerignore
- run.sh
- nginx.conf模板
- 跨域
- jenkins配置
- 測試
- Python