【Linux】解析資料重定向

【Linux】解析資料重定向

本篇重點

  • 基本重定向用法:<、<<、>、>>、 2>、2>>
  • 重定向的判讀方式
  • 重定向符號的前後順序不影響命令的結果
  • 特殊重定向用法:/dev/null、&>、 2>&1 、 1>&2

在 Linux 中,資料重定向是一個非常重要且強大的功能。它可以將命令的輸入或輸出重定向到不同的文件或設備,讓我們能更靈活地處理資料。

基本重定向用法

標準輸入

stdin,代號:0

< 輸入重定向

將文件內容作為命令輸入

範例

number.txt
1
2
3
4
5
6
4
63
85
11
44
9
command
1
2
3
4
5
6
7
8
9
10
# 將 number.txt 文件的內容作為 sort 命令的輸入,並對內容進行排序
sort -n < number.txt

# 終端顯示
4
9
11
44
63
85

健忘筆記

sort -n < number.txt-n 選項是指定對數字進行排序

<< 多行輸入重定向

將多行文字作為命令的輸入,直到遇到指定的結束標記

範例

command
1
2
3
4
5
6
7
8
9
# 將多行文字作為 cat 命令的輸入,並將這些文字輸出到終端
cat << EOF
Hello
World
EOF

# 終端顯示
Hello
World

健忘筆記

EOF 是一個告訴 linux 開始與結束的標記,用於長文本段落或多行命令的輸入。

EOF 本身並沒有特別的含義,可以用其他任意的字串來代替,只要確保開始標記和結束標記一致即可

標準輸出

stdout,代號:1

> 輸出重定向

將命令的標準輸出重定向到文件,會覆蓋文件的原有內容

範例

command
1
2
3
4
5
6
7
8
# echo 命令的輸出寫入到 output.txt 文件中,如果文件已經存在,會覆蓋原有內容。
echo hello world > output.txt

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
hello world

>> 附加重定向

將命令的標準輸出附加到文件末尾,不會覆蓋文件的原有內容

範例

command
1
2
3
4
5
6
7
8
9
#  將 echo 命令的輸出附加到 output.txt 文件的末尾 (延續上一個範例)
echo hello world >> output.txt

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
hello world
hello world

錯誤輸出

stderr,代號:2

2> 錯誤輸出重定向

將命令的錯誤輸出重定向到文件,會覆蓋文件的原有內容

範例

command
1
2
3
4
5
6
7
8
9
10
# non_existing_file 是一個不存在的檔案
# 嘗試列出檔案資訊,並將錯誤訊息寫入到 error.log
ls non_existing_file 2> error.log

# 查看 error.log 的內容
cat error.log

# 因為 non_existing_file 檔案不存在,系統給予錯誤訊息,並錯誤輸出重定向到 error.log
# 終端顯示
ls: cannot access 'non_existing_file': No such file or directory

2>> 錯誤輸出附加重定向

將命令的錯誤輸出附加到文件末尾,不會覆蓋文件的原有內容

範例

command
1
2
3
4
5
6
7
8
9
10
11
# non_existing_file 是一個不存在的檔案
# 嘗試列出檔案資訊,並將錯誤訊息附加到 error.log 的末尾(延續上一個範例)
ls non_existing_file 2>> error.log

# 查看 error.log 的內容
cat error.log

# 因為 non_existing_file 檔案不存在,系統給予錯誤訊息,並錯誤輸出重定向到 error.log 的末尾
# 終端顯示
ls: cannot access 'non_existing_file': No such file or directory
ls: cannot access 'non_existing_file': No such file or directory

綜合應用

標準輸入結合標準輸出

command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用多行輸入重定向搭配輸出重定向
# 製作 input.txt
cat << EOF > input.txt
hello
test 123
EOF

cat input.txt

# 終端顯示
hello
test 123

# 將 input.txt 的內容作為 cat 命令的輸入,在輸出到 output.txt
cat < input.txt > output.txt

# 查看 output.txt 的內容
cat output.txt

# 得到跟 input.txt 一模一樣的 output.txt
# 終端顯示
hello
test 123

標準輸出結合錯誤輸出

command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# non_existing_file 是一個不存在的檔案
# 嘗試列出檔案資訊,並標準輸出到 output.log,錯誤輸出到 error.log
cat non_existing_file > output.log 2> error.log

# 查看 output.log 的內容
cat output.log

# 終端無顯示任何東西,output.log 是空的

# 查看 error.log 的內容
cat error.log

# 終端顯示
cat: non_existing_file: No such file or directory

重定向的判讀方式

[重定向符號] + [文件或字串]

根據重定向符號和文件或字串來判斷,因此符號的前後順序不影響命令的結果

健忘筆記

Shell 在執行命令之前會先解析所有的重定向符號,再執行命令。

Shell 是用來和操作系統進行溝通的命令行界面(CLI),允許用戶通過輸入命令來控制系統執行程序、管理文件系統等

cat < input.txt > output.txt

可以分解為:

  • < input.txt:這部分將 input.txt 的內容重定向到 cat 命令的標準輸入
  • > output.txt:這部分將 cat 命令的標準輸出重定向到 output.txt

Shell 會先解析重定向符號,再執行 cat 命令,從 input.txt 讀取內容並將其寫入 output.txt

因此不管是 cat < input.txt > output.txt 或是 cat > output.txt < input.txt 結果都是一樣的!符號的前後順序不影響命令的結果。

特殊重定向用法

/dev/null

可以視為垃圾桶,任何資料重定向給它就會丟棄

範例

command
1
2
3
4
5
# non_existing_file 是一個不存在的檔案
# 嘗試列出檔案資訊,並將錯誤訊息重定向到 /dev/null
ls non_existing_file 2> /dev/null

# 終端不顯示訊息,錯誤訊息直接丟棄

健忘筆記

重定向到 /dev/null 表示丟棄所有寫入它的數據,因此無法復原要謹慎使用!

&>

將命令的標準輸出和錯誤輸出都重定向到同一個文件

範例

command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# non_existing_file 是不存在的檔案
# 嘗試列出檔案資訊,並將標準輸出和錯誤輸出都重定向到 output.txt
cat non_existing_file &> output.txt

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
cat: cannot access 'non_existing_file': No such file or directory

# 建立 test.txt
echo test > test.txt

# test.txt 是已存在的檔案
# 嘗試列出檔案資訊,並將標準輸出和錯誤輸出都重定向到 output.txt
cat test.txt &> output.txt

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
test

健忘筆記

需要重複輸出到同一個檔案時,可以使用 &>>,將輸出附加到檔案末尾

2>&1、1>&2

  • 2>&1 表示將標準錯誤輸出重定向到標準輸出
  • 1>&2 表示將標準輸出輸出重定向到錯誤輸出

範例

test.txt
1
2
hello
test 123

2>&1

command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# non_existing_file 是不存在的檔案
# 列出 test.txt 和 non_existing_file 檔案資訊,並標準輸出重定向到 output.txt,最後要求標準錯誤輸出重定向到標準輸出
ls test.txt non_existing_file > output.txt 2>&1

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
ls: cannot access 'non_existing_file': No such file or directory
test.txt

# 如果使用 2> 會導致訊息消失,因為錯誤輸出已經重定向到標準輸出了
ls test.txt non_existing_file 2> output.txt 2>&1

# 查看 output.txt 的內容
cat output.txt

# 終端無顯示任何東西,output.txt 是空的

1>&2

command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# non_existing_file 是不存在的檔案
# 列出 test.txt 和 non_existing_file 檔案資訊,並錯誤輸出重定向到 output.txt,最後要求標準輸出輸出重定向到錯誤輸出
ls test.txt non_existing_file 2> output.txt 1>&2

# 查看 output.txt 的內容
cat output.txt

# 終端顯示
ls: cannot access 'non_existing_file': No such file or directory
test.txt

# 如果使用 > 會導致訊息消失,因為標準輸出已經重定向到錯誤輸出了
ls test.txt non_existing_file > output.txt 1>&2

# 查看 output.txt 的內容
cat output.txt

# 終端無顯示任何東西,output.txt 是空的

健忘筆記

同時重定向標準輸出和標準錯誤輸出,可以使用

  • command &> output.log
  • command > output.log 2>&1
  • command 2> output.log 1>&2

三種方法都有一樣的效果

結論

了解並熟悉資料輸出重定向的用法,能夠讓我們更靈活地處理和管理命令的輸入輸出。以下是一些需要注意的地方:

  1. 依不同的需求,使用不同的輸出方式
    • >2> 會覆蓋輸出檔案原本的內容。
    • >>2>> 會將輸出附加到檔案原本的內容末尾。
  2. 重定向符號的前後順序不影響命令的結果

如果你有其他有趣的用法或技巧,歡迎在下方留言分享!

作者

健忘工程師

發表於

2024-07-03

更新於

2024-07-03

許可協議


評論

複製完成