重定向
什麼是重定向:
## 标準的輸入裝置預設指的是鍵盤,标準的輸出裝置預設指的是顯示器。
#- 輸入重定向:指定裝置(通常是檔案或指令的執行結果)來代替鍵盤作為新的輸入裝置;
#- 輸出重定向:将原本要輸出在螢幕上的結果放到指定的裝置(通常是檔案)
為何用(重定向的作用)
1.當螢幕輸出的資訊很重要,而且希望儲存重要的資訊備份
2.不幹擾螢幕的使用 ping baidu
3.儲存錯誤/報錯日志
4.定時任務的運作結果
5.執行一個指令,把報錯資訊丢棄到/dev/null
5.執行一個指令,可能報錯和正确的輸出并存,類似錯誤日志與标準正确日志需要分别輸出至不同的檔案。
輸入和輸出
執行一個shell程式時通常會自動打開三個檔案描述符
名稱 | 檔案描述符 | |
标準輸入(stdin) | 鍵盤,也可以是其他檔案或者指令的輸出的内容可以作為标準輸入 | |
标準輸出(stdout) | 1 | 預設輸出到螢幕 |
錯誤輸出(stderr) | 2 | 預設輸出到螢幕 |
檔案名稱(filename) | 3+ |
程序将從标準輸入中得到資料,将正常輸出列印至螢幕終端,将錯誤的輸出資訊也列印至螢幕終端。
程序使用檔案描述符(file descriptors)來管理打開的檔案
以cat指令為例, cat指令的功能是從指令行給出的檔案中讀取資料,并将這些資料直接送到标準輸出。
直接用cat:
# cat /etc/passwd
會把/etc/passwd的内容依次顯示到螢幕上
# cat cat指令行中沒有參數, 它就會從标準輸入中讀取資料, 并将其送到标準輸出。
hello 按enter後使用者輸入的每一行都立刻被cat指令輸出到螢幕上。
hello
輸出重定向
符号格式 | 作用 |
指令> /1>檔案 | 标準輸出重定向(覆寫) 将指令執行的結果放到檔案中,不顯示在螢幕上,覆寫檔案内容 |
指令>>檔案 | 标準輸出重定向(追加) 将指令執行的結果輸出到指定的檔案中,不會覆寫,如果該檔案已包含資料,新資料将寫入到原有内容的後面。 |
指令2>檔案 | 錯誤輸出重定向(覆寫) 将原本要顯示在螢幕的報錯内容放入指定檔案,會先清空檔案,再覆寫原有内容 |
指令2>>檔案 | 錯誤輸出重定向(追加) 将原本要顯示在螢幕的報錯内容追加到指定檔案 |
例1 标準輸出重定向(覆寫)
[root@localhost ~]# ifconfig eth0 > abc (會自動建立檔案abc)
[root@localhost ~]# cat abc
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.251 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::9bc0:f459:3a67:bd7a prefixlen 64 scopeid 0x20<link>
inet6 fe80::152f:f2c7:21b3:412b prefixlen 64 scopeid 0x20<link>
inet6 fe80::e1af:89d9:4338:31df prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c3:b0:5d txqueuelen 1000 (Ethernet)
RX packets 2812 bytes 244635 (238.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1879 bytes 363592 (355.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
例2 标準輸出重定向(追加)
[root@localhost ~]# echo "This is network conf" >> if (沒有自動建立了if檔案)
[root@localhost ~]# cat if
This is network conf
[root@localhost ~]# echo 111 >> if
[root@localhost ~]# cat if
This is network conf
111
例3 錯誤輸出重定向
[root@localhost ~]# su - xxx
[xxx@localhost ~]$ find /etc -name "*.conf" (标準輸出和錯誤全部顯示在螢幕上)
[xxx@localhost ~]$ find /etc -name "*.conf" 1>a 2>b (标準輸出進檔案a,錯誤進b)
[xxx@localhost ~]$ cat b
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
......(省略)
&符
[zls@zls ~]$ find /etc -name "*.conf" &>ab (全進檔案ab)
[root@localhost ~]# crontab -e 編輯定時任務
# 在裡面輸入:
* * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
輸入重定向
輸入重定向,即原本從鍵盤等裝置上獲得的輸入資訊,重定向由指令的輸出作為輸入。
指令 < 檔案 将指定檔案作為指令的輸入裝置
指令 << 分界符 表示從标準輸入裝置(鍵盤)中讀入,直到遇到分界符才停止(讀入的資料不包括分界符)
指令 < 檔案1 > 檔案2 将檔案1作為指令的輸入裝置,該指令的執行結果輸出到檔案2 中。
例1
[root@localhost ~]# cat /etc/passwd
[root@localhost ~]# cat < /etc/passwd 輸出結果同上面指令相同
[root@localhost ~]# grep 'root' 等待輸入
cch
kjnj
[root@localhost ~]# grep 'root' < /etc/passwd 輸入裝置變為/etc/passwd
root:x:0:0:root:/root:/bin/bash
例2
[root@localhost ~]# cat a.txt
[root@localhost ~]# cat < /etc/passwd > a.txt
[root@localhost ~]# cat a.txt 輸出了和 /etc/passwd 檔案内容相同的資料
自己操作試驗:
[root@localhost ~]# vim 2.txt 建立一個2.txt 輸入:“不管是昨天的風”
[root@localhost ~]# cat > 2.txt 需要按ctrl D結束輸入
woshii^Hnnibaba
babab
[root@localhost ~]# cat 2.txt 發現被覆寫了
woshinnibaba
babab
[root@localhost ~]# cat > 2.txt < A 按A結束輸入 一個<不行
bash: A: No such file or directory
[root@localhost ~]# cat > 2.txt << A
> hahahahah
> A
[root@localhost ~]# cat >> 2.txt << A >>追加,不覆寫
> hohouhhh
> A
[root@localhost ~]# cat 2.txt
hahahahah
hohouhhh