『忘了再學』Shell基礎 — 6、Bash基本功能(輸入輸出重定向)

繁華似錦Fighting發表於2022-03-30

1、Bash的標準輸入輸出

我們前邊一直在說,在Linux系統下,一切皆是檔案,鍵盤和顯示器等硬體都是檔案,如下圖:

image

從上圖中可以看出,鍵盤的裝置檔名為/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中。(常用)

image

統一儲存和分開儲存看你習慣。

注意,在正確輸出的時候>或者>>兩邊是可以有空格的,如果是錯誤輸出的時候,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命令用到過。

<<號用的就更少了,基本沒有實際的應用。

image

uio就相當於一個分界符,在兩個uio中間的內容,輸入給wc命令,進行統計。

相關文章