Linux重定向
Linux重定向
重定向概述:
什麼是重定向:
Linux中的重定向就是將原本要輸出到螢幕中的資料資訊,重新指向某個特定檔案當中,或者定向到黑洞檔案(/dev/null)中。
重定向的作用:
- 當螢幕輸出的資訊很重要,希望儲存時
- 後臺執行的程式一般都會有輸出,不希望它輸出干擾到終端
- 執行定時備份任務,希望將備份結果保留下來時
- 執行一些命令,會提示一些報錯資訊,可以直接將報錯丟棄。
- 執行命令時希望將報錯和正確內容區分在不同檔案中時(日誌)
命令返回值(拓展)
在Linux下,不管是啟動桌面程式還是執行命令,所有程式在結束時都會返回一個數字值,這個值叫做返回值,或者稱為錯誤號。
[root@localhost ~]# ls
[root@localhost ~]# echo $?
0
我們執行ls命令,通過echo$?,列印$?的值,我們發現返回值是0
返回值是0,則代表上一條命令執行成功返回值
非0,則代表上一條命令執行不成功
檔案描述符
li可以理解為linux跟蹤開啟檔案,而分配的一個數字,這個數字有點類似c語言操作檔案時候的控制代碼,通過控制代碼就可以實現檔案的讀寫操作。 使用者可以自定義檔案描述符範圍是:3-num,這個最大數字,跟使用者的:ulimit –n 定義數字有關係,不能超過最大值。
linux啟動後,會預設開啟3個檔案描述符,分別是:標準輸入standard input 0,正確輸出standard output 1,錯誤輸出:error output 2。以後開啟檔案後。新增檔案繫結描述符可以依次增加。 一條shell命令執行,都會繼承父程序的檔案描述符。因此,所有執行的shell命令,都會有預設3個檔案描述符。
名稱 | 檔案描述符 | 作用 |
---|---|---|
標準輸入(stdin) | 0 | 通常是鍵盤,也可以是其他檔案或者命令的輸出的內容可以作為標準輸入 |
標準輸出(stdout) | 1 | 預設輸出到螢幕 |
錯誤輸出(stderr) | 2 | 預設輸出到螢幕 |
檔名稱(filename) | 3+ |
-
當程序操作一個檔案時:
- 首先程式是無法直接訪問硬體,需要藉助核心來訪問檔案
- 而核心kernel需要利用檔案描述(file descriptor)來訪問
-
總結:程序使用檔案描述符來管理開啟的檔案對應關係
-
通常程式訪問一個檔案至少會開啟三個標準檔案,分別是標準輸入,標準輸出,錯誤輸出
-
程序將從標準輸入中的到資料,將正常輸出列印至螢幕終端,將錯誤的輸出資訊也列印至螢幕終端
輸入輸出符號及作用
名稱 | 符號 | 作用 |
---|---|---|
標準輸入重定向 | <或者0< | 將符號右邊的內容交給符號左邊的命令 |
標準輸出覆蓋重定向 | >或者1> | 將原本要輸出在螢幕上的正確內容,覆蓋到重定向的檔案中 |
標準輸出追加重定向 | >>或者1>> | 將原本要輸出在螢幕上的正確內容,追加到重定向的檔案中 |
錯誤輸出覆蓋重定向 | 2> | 將原本要輸出在螢幕上的錯誤內容,覆蓋到重定向的檔案中 |
錯誤輸出追加重定向 | 2>> | 將原本要輸出在螢幕上的錯誤內容,追加到重定向的檔案中 |
案例1:標準輸出覆蓋重定向
- 標準輸出重定向示例
- 如果檔案不存在則建立
- 如果檔案存在則清空內容,後寫入
[root@localhost ~]# ifconfig eth0 > abc
案例2:標準輸出追加重定向
- 標準輸出重定向示例
- 如果檔案不存在則建立
- 如果檔案存在則在檔案尾部新增內容
[root@localhost ~]# echo "This is network conf" >> if
案例3:錯誤輸出重定向
- 錯誤輸出重定向示例
- 正確輸出及錯誤輸出至相同檔案
- 正確輸出及錯誤輸出至不同的檔案
[root@localhost ~]#find /etc -name "*.conf" 1>ok 2>ok
[root@localhost ~]#find /etc -name "*.conf" 1>ok 2>error
案例4:混合和輸出重定向
- 錯誤輸出重定向示例
- 將正確輸出和錯誤輸出混合至同一檔案
- 將兩個檔案內容組合為一個檔案
#將標準輸出和標準錯誤輸出重定向到同一個檔案, 混合輸出
1.[root@localhost ~]# find /etc -name "*.conf" &>ab
2.[root@localhost ~]# find /etc -name "*.conf" >ab 2>&1
#合併兩個檔案內容至一個檔案
[root@localhost ~]# cat a b > c
案例5:將內容輸出至黑洞
[root@localhost ~]# ls /root/error>ab 2>/dev/null
[root@localhost ~]# ls /root/error>ab &>/dev/null
案例6:輸入重定向
1.
#沒有改變輸入的方向,預設鍵盤,此時等待輸入
[root@localhost ~]# grep 'root'
xxx
xxx
[root@localhost ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
2.
[root@localhost ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@localhost ~]# dd </dev/zero >/file2.txt bs=1M count=20
案例7:利用重定向建立多行的檔案
[root@localhost ~]# vim fruit.sh
#!/bin/sh
menu(){
cat <<EOF
+------------+
| 1 | apple |
+---+--------+
| 2 | pear |
+---+--------+
| 3 | banana |
+---+--------+
| 4 | cherry |
+---+--------+
EOF
read -p "please input a num: " fruit
}
usage(){
echo "USAGE:請輸入水果編號"
exit 1
}
color(){
case "$fruit" in
1)
echo -e "\E[1;31mapple \E[0m"
;;
2)
echo -e "\E[1;20mpear \E[0m"
;;
3)
echo -e "\E[1;33mbanana \E[0m"
;;
4)
echo -e "\E[1;35mcherry \E[0m"
;;
*)
usage
esac
}
menu
color
輸入輸出過程檢測
#持續追蹤檢視檔案內容
[root@localhost ~]# tail -f /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
lw:x:1000:1000::/home/lw:/bin/bash
lw1:x:1001:1001::/home/lw1:/bin/bash
oldboy:x:615:1002::/home/oldboy:/bin/bash
^Z (ctrl+z 將程序轉到後臺)
[1]+ Stopped tail -f /etc/passwd
#檢視執行的程序
[root@localhost ~]# ps
PID TTY TIME CMD
8217 pts/1 00:00:00 bash
8258 pts/1 00:00:00 tail
8259 pts/1 00:00:00 ps
#檢視8258程序下的檔案描述符
[root@localhost ~]# ls -l /proc/8258/fd
total 0
lrwx------. 1 root root 64 Apr 13 19:25 0 -> /dev/pts/1
lrwx------. 1 root root 64 Apr 13 19:25 1 -> /dev/pts/1
lrwx------. 1 root root 64 Apr 13 19:25 2 -> /dev/pts/1
lr-x------. 1 root root 64 Apr 13 19:25 3 -> /etc/passwd
lr-x------. 1 root root 64 Apr 13 19:25 4 -> anon_inode:inotify
# Linux檢視標準輸入輸出裝置
[root@localhost ~]# ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stdout -> /proc/self/fd/1
補充:Linux重定向&符
$ command > file 2>&1
$ command >> file 2>&1
這裡的&沒有固定的意思
放在>後面的&,表示重定向的目標不是一個檔案,而是一個檔案描述符。
換言之 2>1 代表將stderr重定向到當前路徑下檔名為1的regular file中,而2>&1代表將stderr重定向到檔案描述符為1的檔案(即/dev/stdout)中,這個檔案就是stdout在file system中的對映
而&>file是一種特殊的用法,也可以寫成>&file,二者的意思完全相同,都等價於
>file 2>&1