重定向正常輸出c++
> :覆蓋以存在文件的內容,很危險的操做shell
>>:若是文件已經存在,則是在原內容的最後追加。bash
能夠禁止>的覆蓋行爲,使用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
已經禁止了覆蓋,可是確認就是要覆蓋,能夠使用。code
重定向錯誤輸出input
合併重定向正常輸出和錯誤輸出it
把錯誤輸出,重定向到正常輸出:2>&1io
# cat /etc/issue2 >> /tmp/is1 2>&1
若是命令產生的是正常輸出,則重定向到/tmp/is1;若是產生的是錯誤輸出,則把錯誤輸出重定向到正常輸出。因爲正常輸出已經重定向到了/tmp/is1了,因此錯誤輸出也重定向到了/tmp/is1.class
重定向輸入:<
支持文件做爲參數的命令,能夠不使用<
,也可以重定向輸入,好比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