1、Bash的標準輸入輸出
我們前邊一直在說,在Linux系統下,一切皆是檔案,鍵盤和顯示器等硬體都是檔案,如下圖:
從上圖中可以看出,鍵盤的裝置檔名為/dev/stdin
,顯示器標準正確輸入的裝置檔名為/dev/stdout
,顯示器標準錯誤輸入的裝置檔名為/dev/stderr
。
這些裝置檔名非常不好記憶,Shell允許我們用檔案描述符來描述對應的裝置,也就是用0、1、2,分別對應鍵盤、正確顯示器,錯誤顯示器。
2、輸出重定向
什麼叫輸出重定向?
命令的輸出,是輸出給標準輸出的,也就是輸出到顯示器上。而輸出重定向就是命令的輸出,不輸出給標準輸出,而是把輸出的內容,輸出到檔案中。
(1)標準輸出重定向
命令 > 檔案
:以覆蓋的方式,把命令的正確輸出,輸出到指定的檔案或裝置當中。命令 >> 檔案
:以追加的方式,把命令的正確輸出,輸出到指定的檔案或裝置當中。
示例如下:
# 覆蓋的方式
[root@localhost ~]# pwd > abc
[root@localhost ~]# cat abc
/root
# 追加的方式
[root@localhost ~]# pwd >> abc
[root@localhost ~]# cat abc
/root
/root
只要該命令有結果,都能夠輸進行輸出重定向。
(2)標準錯誤輸出重定向
如果執行的命令出現報錯,用上邊的方式是不能夠進行輸出內容重定向的,錯誤資訊會直接輸出到標準錯誤輸出,如下:
[root@localhost ~]# lsdgagsa >> abc
-bash: lsdgagsa: command not found
錯誤命令 2>檔案
:以覆蓋的方式,把命令的錯誤輸出,輸出到指定的檔案或裝置當中。錯誤命令 2>>檔案
:以追加的方式,把命令的錯誤輸出,輸出到指定的檔案或裝置當中。
這個2
是檔案描述符,表示標準錯誤輸出,看上表。
示例如下:
[root@localhost ~]# lsdgagsa 2>> abc
[root@localhost ~]# cat abc
/root
/root
-bash: lsdgagsa: command not found
這裡需要注意的是,上邊的標準正確輸出和標準錯誤輸出的重定向有一些小問題,就是我要事先知道這條命令是否報錯,才能選擇是使用標準正確輸出還是使用標準錯誤輸出。
這樣十分不合理,我明知道命令會報錯,那我直接寫對不就完了。所以我們在工作中寫指令碼的時候,常用的輸出重定向的方式是下面的方式。
(3)正確輸出和錯誤輸出同時儲存
方式一
命令 > 檔案 2>&1
:以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中。命令 >> 檔案 2>&1
:以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中。(常用)
示例如下:
# 把ls命令的查詢結果覆蓋儲存到abc檔案中
[root@localhost ~]# ls > abc 2>&1
[root@localhost ~]# cat abc
anaconda-ks.cfg
install.log
install.log.syslog
# 把錯誤資訊追加儲存到abc檔案中
[root@localhost ~]# lsadfgag >> abc 2>&1
[root@localhost ~]# cat abc
anaconda-ks.cfg
install.log
install.log.syslog
-bash: lsadfgag: command not found
命令 >> 檔案 2>&1
的意思是,把命令的正確輸出,輸出到檔案中,然後把命令的錯誤輸出,輸出到正確輸出的檔案中。
方式二
命令 &>檔案
:以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中。命令 &>>檔案
:以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中。(常用)
示例如下:
# 把pwd命令的結果覆蓋儲存到abc檔案中
[root@localhost ~]# pwd &> abc
[root@localhost ~]# cat abc
/root
# 把錯誤資訊追加儲存到abc檔案中
[root@localhost ~]# lsadfgag &>> abc
[root@localhost ~]# cat abc
/root
-bash: lsadfgag: command not found
方式三
命令>>檔案1 2>>檔案2
:把正確的輸出追加到檔案1中,把錯誤的輸出追加到檔案2中。(常用)
統一儲存和分開儲存看你習慣。
注意,在正確輸出的時候
>
或者>>
兩邊是可以有空格的,如果是錯誤輸出的時候,2和>
或者>>
之間是不能有空格的。如下,提示語法錯誤。
[root@localhost ~]# lsgdagasasd >> abc 2 > &1 -bash: syntax error near unexpected token `&’
3、輸入重定向
輸入重定向就是<
。意思是命令的輸入是由標準輸入輸入的,也就是由鍵盤輸入的。輸入重定向就是改變輸入方向,不在由鍵盤作為輸入,而拿檔案作為命令的輸入。(輸入重定向比較少見)
我們只在之前給原始碼包打補丁的patch
命令(文章https://www.cnblogs.com/liuyuelinfighting/p/15574188.html),和RPM原始碼包檔案提取中的cpio
命令用到過。
雙<<
號用的就更少了,基本沒有實際的應用。
uio
就相當於一個分界符,在兩個uio
中間的內容,輸入給wc
命令,進行統計。