linux就該這麽學-第四天
3.1 輸入輸出重定向
既然我們已經在上一章學完了幾乎所有基礎且常用的Linux命令,那麽接下來的任務就是把多個Linux命令適當地組合到一起,使其協同工作,以便我們更加高效地處理數據。要做到這一點,就必須搞明白命令的輸入重定向和輸出重定向的原理。
簡而言之,輸入重定向是指把文件導入到命令中,而輸出重定向則是指把原本要輸出到屏幕的數據信息寫入到指定文件中。在日常的學習和工作中,相較於輸入重定向,我們使用輸出重定向的頻率更高,所以又將輸出重定向分為了標準輸出重定向和錯誤輸出重定向兩種不同的技術,以及清空寫入與追加寫入兩種模式。聽起來就很玄妙?劉遄老師接下來將慢慢道來。
標準輸入重定向(STDIN,文件描述符為0):默認從鍵盤輸入,也可從其他文件或命令中輸入。
標準輸出重定向(STDOUT,文件描述符為1):默認輸出到屏幕。
錯誤輸出重定向(STDERR,文件描述符為2):默認輸出到屏幕。
比如我們分別查看兩個文件的屬性信息,其中第二個文件是不存在的,雖然針對這兩個文件的操作都分別會在屏幕上輸出一些數據信息,但這兩個操作的差異其實很大:
[[email protected] ~]# touch linuxprobe
[[email protected] ~]# ls -l linuxprobe
-rw-r--r--. 1 root root 0 Aug 5 05:35 linuxprobe
[[email protected] ~]# ls -l xxxxxx
在上述命令中,名為linuxprobe的文件是存在的,輸出信息是該文件的一些相關權限、所有者、所屬組、文件大小及修改時間等信息,這也是該命令的標準輸出信息。而名為xxxxxx的第二個文件是不存在的,因此在執行完ls命令之後顯示的報錯提示信息也是該命令的錯誤輸出信息。那麽,要想把原本輸出到屏幕上的數據轉而寫入到文件當中,就要區別對待這兩種輸出信息。
對於輸入重定向來講,用到的符號及其作用如表3-1所示。
表3-1 輸入重定向中用到的符號及其作用
符號 作用
命令 < 文件 將文件作為命令的標準輸入
命令 << 分界符 從標準輸入中讀入,直到遇見分界符才停止
命令 < 文件1 > 文件2 將文件1作為命令的標準輸入並將標準輸出到文件2
對於輸出重定向來講,用到的符號及其作用如表3-2所示。
表3-2 輸出重定向中用到的符號及其作用
符號 作用
命令 > 文件 將標準輸出重定向到一個文件中(清空原有文件的數據)
命令 2> 文件 將錯誤輸出重定向到一個文件中(清空原有文件的數據)
命令 >> 文件 將標準輸出重定向到一個文件中(追加到原有內容的後面)
命令 2>> 文件 將錯誤輸出重定向到一個文件中(追加到原有內容的後面)
命令 >> 文件 2>&1
或
命令 &>> 文件 將標準輸出與錯誤輸出共同寫入到文件中(追加到原有內容的後面)
對於重定向中的標準輸出模式,可以省略文件描述符1不寫,而錯誤輸出模式的文件描述符2是必須要寫的。我們先來小試牛刀。通過標準輸出重定向將man bash命令原本要輸出到屏幕的信息寫入到文件readme.txt中,然後顯示readme.txt文件中的內容。具體命令如下:
[[email protected] ~]# man bash > readme.txt
[[email protected] ~]# cat readme.txt
BASH(1) General Commands Manual BASH(1)
NAME
bash - GNU Bourne-Again Shell
SYNOPSIS
bash [options] [file]
COPYRIGHT
Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.
DESCRIPTION
Bash is an sh-compatible command language interpreter that executes
commands read from the standard input or from a file. Bash also incor‐
porates useful features from the Korn and C shells (ksh and csh).
Bash is intended to be a conformant implementation of the Shell and
Utilities portion of the IEEE POSIX specification (IEEE Standard
1003.1). Bash can be configured to be POSIX-conformant by default.
………………省略部分輸出信息………………
有沒有感覺到很方便呢?我們接下來嘗試輸出重定向技術中的覆蓋寫入與追加寫入這兩種不同模式帶來的變化。首先通過覆蓋寫入模式向readme.txt文件寫入一行數據(該文件中包含上一個實驗的man命令信息),然後再通過追加寫入模式向文件再寫入一次數據,其命令如下:
[[email protected] ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[[email protected] ~]# echo "Quality linux learning materials" >> readme.txt
在執行cat命令之後,可以看到如下所示的文件內容:
[[email protected] ~]# cat readme.txt
Welcome to LinuxProbe.Com
Quality linux learning materials
雖然都是輸出重定向技術,但是不同命令的標準輸出和錯誤輸出還是有區別的。例如查看當前目錄中某個文件的信息,這裏以linuxprobe文件為例。因為這個文件是真實存在的,因此使用標準輸出即可將原本要輸出到屏幕的信息寫入到文件中,而錯誤的輸出重定向則依然把信息輸出到了屏幕上。
[[email protected] ~]# ls -l linuxprobe
-rw-r--r--. 1 root root 0 Mar 1 13:30 linuxprobe
[[email protected] ~]# ls -l linuxprobe > /root/stderr.txt
[[email protected] ~]# ls -l linuxprobe 2> /root/stderr.txt
-rw-r--r--. 1 root root 0 Mar 1 13:30 linuxprobe
如果想把命令的報錯信息寫入到文件,該怎麽操作呢?當用戶在執行一個自動化的Shell腳本時,這個操作會特別有用,而且特別實用,因為它可以把整個腳本執行過程中的報錯信息都記錄到文件中,便於安裝後的排錯工作。接下來我們以一個不存在的文件進行實驗演示:
[[email protected] ~]# ls -l xxxxxx
cannot access xxxxxx: No such file or directory
[[email protected] ~]# ls -l xxxxxx > /root/stderr.txt
cannot access xxxxxx: No such file or directory
[[email protected] ~]# ls -l xxxxxx 2> /root/stderr.txt
[[email protected] ~]# cat /root/stderr.txt
ls: cannot access xxxxxx: No such file or directory
輸入重定向相對來說有些冷門,在工作中遇到的概率會小一點。輸入重定向的作用是把文件直接導入到命令中。接下來使用輸入重定向把readme.txt文件導入給wc -l命令,統計一下文件中的內容行數。
[[email protected] ~]# wc -l < readme.txt
2
上述命令實際上等同於接下來要學習的cat readme.txt | wc -l的管道符命令組合。
linux就該這麽學-第四天