在此感謝原作者,文章清晰易懂。
标準輸入,輸出和錯誤
---------------------------------
檔案檔案 描述符
---------------------------------
輸入檔案—标準輸入 0
輸出檔案—标準輸出 1
錯誤輸出檔案—标準錯誤 2
---------------------------------
1.重定向
COMMAND_OUTPUT >
2 # 将stdout重定向到一個檔案.
3 # 如果這個檔案不存在, 那就建立, 否則就覆寫.
4
5 ls -lR > dir-tree.list
6 # 建立一個包含目錄樹清單的檔案.
7
8 : > filename
9 # >操作, 将會把檔案"filename"變為一個空檔案(就是size為0).
10 # 如果檔案不存在, 那麼就建立一個0長度的檔案(與'touch'的效果相同).
11 # :是一個占位符, 不産生任何輸出.
12
13 > filename
14 # >操作, 将會把檔案"filename"變為一個空檔案(就是size為0).
15 # 如果檔案不存在, 那麼就建立一個0長度的檔案(與'touch'的效果相同).
16 # (與上邊的": >"效果相同, 但是某些shell可能不支援這種形式.)
17
18 COMMAND_OUTPUT >>
19 # 将stdout重定向到一個檔案.
20 # 如果檔案不存在, 那麼就建立它, 如果存在, 那麼就追加到檔案後邊.
21
22
23 # 單行重定向指令(隻會影響它們所在的行):
24 # --------------------------------------------------------------------
25
26 1>filename
27 # 重定向stdout到檔案"filename".
28 1>>filename
29 # 重定向并追加stdout到檔案"filename".
30 2>filename
31 # 重定向stderr到檔案"filename".
32 2>>filename
33 # 重定向并追加stderr到檔案"filename".
34 &>filename
35 # 将stdout和stderr都重定向到檔案"filename".
36
37 M>N
38 # "M"是一個檔案描述符, 如果沒有明确指定的話預設為1.
39 # "N"是一個檔案名.
40 # 檔案描述符"M"被重定向到檔案"N".
41 M>&N
42 # "M"是一個檔案描述符, 如果沒有明确指定的話預設為1.
43 # "N"是另一個檔案描述符.
44
45 #==============================================================================
46
47 # 重定向stdout, 一次一行.
48 LOGFILE=script.log
49
50 echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
51 echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
52 echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
53 echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
54 # 每行過後, 這些重定向指令會自動"reset".
58 # 重定向stderr, 一次一行.
59 ERRORFILE=script.errors
61 bad_command1 2>$ERRORFILE # Error message sent to $ERRORFILE.
62 bad_command2 2>>$ERRORFILE # Error message appended to $ERRORFILE.
63 bad_command3 # Error message echoed to stderr,
64 #+ and does not appear in $ERRORFILE.
65 # 每行過後, 這些重定向指令也會自動"reset".
66 #==============================================================================
67
70 2>&1
71 # 重定向stderr到stdout.
72 # 将錯誤消息的輸出, 發送到與标準輸出所指向的地方.
73
74 i>&j
75 # 重定向檔案描述符i到j.
76 # 指向i檔案的所有輸出都發送到j.
77
78 >&j
79 # 預設的, 重定向檔案描述符1(stdout)到j.
80 # 所有傳遞到stdout的輸出都送到j中去.
81
82 0< FILENAME
83 < FILENAME
84 # 從檔案中接受輸入.
85 # 與">"是成對指令, 并且通常都是結合使用.
86 #
87 # grep search-word
88
90 [j]<>filename
91 # 為了讀寫"filename", 把檔案"filename"打開, 并且将檔案描述符"j"配置設定給它.
92 # 如果檔案"filename"不存在, 那麼就建立它.
93 # 如果檔案描述符"j"沒指定, 那預設是fd 0, stdin.
94 #
95 # 這種應用通常是為了寫到一個檔案中指定的地方.
96 echo 1234567890 > File # 寫字元串到"File".
97 exec 3<> File # 打開"File"并且将fd 3配置設定給它.
98 read -n 4
99 echo -n . >&3 # 寫一個小數點.
100 exec 3>&- # 關閉fd 3.
101 cat File # ==> 1234.67890
102 # 随機通路.
106 |
107 # 管道.
108 # 通用目的處理和指令鍊工具.
109 # 與">", 很相似, 但是實際上更通用.
110 # 對于想将指令, 腳本, 檔案和程式串連起來的時候很有用.
111 cat *.txt | sort | uniq > result-file
112 # 對所有.txt檔案的輸出進行排序, 并且删除重複行.
113 # 最後将結果儲存到"result-file"中.
command > filename 把标準輸出重定向到一個新檔案中
command >> filename 把标準輸出重定向到一個檔案中(追加)
command 1 > fielname 把标準輸出重定向到一個檔案中
command > filename 2>&1 把标準輸出和标準錯誤一起重定向到一個檔案中
command 2 > filename 把标準錯誤重定向到一個檔案中
command 2 >> filename 把标準輸出重定向到一個檔案中(追加)
command >> filename 2>&1 把标準輸出和标準錯誤一起重定向到一個檔案中(追加)
command < filename >filename2 把command指令以filename檔案作為标準輸入,以filename2檔案作為标準輸出
command < filename 把command指令以filename檔案作為标準輸入
command << delimiter 把從标準輸入中讀入,直至遇到delimiter分界符
command
command >&m 把标準輸出重定向到檔案描述符m中
command
2.雙向重定向
即在重定向資料到目标檔案的同時,還要保證資料能夠正常處理,使用tee指令。
tee [-a] file
-a 往檔案尾添加内容
last | tee last_backup | cut -d " " -f 1 #tee相當于對last的結果備份了一次