一,I/O重定向 重定向正常輸出 \ :覆蓋以存在文件的內容,很危險的操作 \ :如果文件已經存在,則是在原內容的最後追加。 可以禁止 的覆蓋行為,使用 。只在當前會話有效。 恢復覆蓋行為。 \ |: 已經禁止了覆蓋,但是確認就是要覆蓋,可以使用。 重定向錯誤輸出 2 :覆蓋以存在文件的內容,很危險 ...
一,I/O重定向
重定向正常輸出
> :覆蓋以存在文件的內容,很危險的操作
>>:如果文件已經存在,則是在原內容的最後追加。
可以禁止>的覆蓋行為,使用
set -C
。只在當前會話有效。set +C
恢復覆蓋行為。# set -C # cat /etc/issue > /tmp/is1 -bash: /tmp/is1: cannot overwrite existing file # cat /etc/issue >| /tmp/is1
>|:
set -C
已經禁止了覆蓋,但是確認就是要覆蓋,可以使用。
重定向錯誤輸出
- 2>:覆蓋以存在文件的內容,很危險的操作
- 2>>:如果文件已經存在,則是在原內容的最後追加。
- 2>|:強制覆蓋
合併重定向正常輸出和錯誤輸出
- &>:覆蓋以存在文件的內容,很危險的操作
- &>>:如果文件已經存在,則是在原內容的最後追加。
- &>|:不支持,語法報錯。
把錯誤輸出,重定向到正常輸出:2>&1
# cat /etc/issue2 >> /tmp/is1 2>&1
如果命令產生的是正常輸出,則重定向到/tmp/is1;如果產生的是錯誤輸出,則把錯誤輸出重定向到正常輸出。由於正常輸出已經重定向到了/tmp/is1了,所以錯誤輸出也重定向到了/tmp/is1.
重定向輸入:
<
支持文件作為參數的命令,可以不使用
<
,也能夠重定向輸入,比如cat
# cat < /etc/issue \S Kernel \r on an \m # cat /etc/issue \S Kernel \r on an \m
不支持文件作為參數的命令,必須明確使用
<
,才能夠重定向輸入。比如tr
tr
命令用途:替換或者刪除特定的字元語法:
tr [OPTION]... SET1 [SET2]
把輸入的1替換成2,把輸入的2替換成4
$ tr [12] [34] 12//輸入的12 34//被替換成了34 22//輸入的22 44//被替換成了44
利用重定向,把文件里的小寫字母,全部替換成相應的大寫字母,把結果顯示到標準輸出。
# cat /etc/issue \S Kernel \r on an \m # tr [[:lower:]] [[:upper:]] < /etc/issue \S KERNEL \R ON AN \M
利用重定向,把文件里的小寫字母,全部刪除後,把結果顯示到標準輸出。
# cat /etc/issue \S Kernel \r on an \m # tr -d [a-z] < /etc/issue \S K \ \
<<
:是乾什麼的?<<後面的詞作為結尾,把內容重定向到文件里# cat > /tmp/is1.out << EOF > hello > cat cat > EOF # cat /tmp/is1.out hello cat cat
特殊設備:/dev/null
重定向到/dev/null,就相當於消失了。
在shell腳本程式里,當關心的是,命令的執行結果(成功,還是失敗),而不是命令執行後的輸出的時候,就可以把命令的輸出重定向到/dev/null里。
例子:只想知道/etc/passwd文件里是否有第一行,而不關心第一行的內容時,使用下麵的命令。
# head -1 /etc/passwds &> /dev/null # echo $? 1 # head -1 /etc/passwd &> /dev/null # echo $? 0
二,管道
連接程式,把前一個命令的輸出作為後一個命令的輸入。
command1 | command2 | command3 ...
例子1:把cat的輸出,作為tr的輸入
# cat /etc/issue
\S
Kernel \r on an \m
# cat /etc/issue | tr [a-z] [A-Z]
\S
KERNEL \R ON AN \M
例子:把who的輸出,作為tail的輸入,再把tail的輸出,作為tr的輸入。
# who
ys :0 2019-12-16 10:22 (:0)
ys pts/0 2019-12-16 10:22 (:0)
root pts/1 2019-12-16 10:23 ()
# who | tail -2
aa pts/0 2019-12-16 10:22 (:0)
root pts/1 2019-12-16 10:23 ()
# who | tail -2 | tr [a-z] [A-Z]
AA PTS/0 2019-12-16 10:22 (:0)
ROOT PTS/1 2019-12-16 10:23 ()
重定向後,原來命令的輸出就沒有了,能夠保存上一個命令的輸出嗎?使用tee
命令。
tee
:read from standard input and write to standard output and files。從標準輸入讀取,然後寫入到標準輸出和文件中。
例子:保留cat的輸出,並把cat的輸出,傳遞給tr命令
# cat /etc/issue | tee /tmp/is3.out | tr [a-z] [A-Z]
\S
KERNEL \R ON AN \M
# cat /tmp/is3.out
\S
Kernel \r on an \m
練習1:把/etc/passwd文件的前6行的信息轉換為大寫字母後輸出
# head -6 /etc/passwd | tr [a-z] [A-Z]
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC