Linux 中的管道和重定向


介紹

管道和重定向是 Linux 中使用的兩種不同的機制。有時,我們需要將一個命令的輸出作為另一個命令的輸入並執行某些操作。在這種情況下,我們使用管道運算子。運算子是“|”。它位於“Enter”鍵的上方。有時,我們會將所有命令的輸出重定向或傳遞到檔案以進行儲存。此外,我們將檔案的內容作為命令的輸入。這稱為重定向,並使用“>”、“>>”和“<”等運算子。

在本文中,我們將學習如何在 Linux 中使用管道和重定向。

示例 1:重定向到新檔案

當我們在 Linux 終端中執行任何命令時,輸出將列印在螢幕上。如果我們想傳送命令的輸出,我們可以使用“>”來執行此操作。

在第一個示例中,我們將看到終端中的輸出。

$ ls -lhrt
total 16K
drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip
drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cat-more-less
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cmd-bash

現在,在使用“>”之後,終端中將沒有任何輸出,輸出將儲存在“redirection.txt”中。

$ ls -lhrt > redirection.txt

$ cat redirection.txt
total 16K
drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip
drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash
-rw-rw-r-- 1 rian rian    0 Feb 11 22:43 redirection.txt
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cat-more-less
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cmd-bash

示例 2:重定向到現有檔案

在最後一個示例中,我們已將輸出重定向到新檔案。我們也可以將輸出重定向到現有檔案。但是有一個問題。如果我們使用“>”重定向到現有檔案,則現有檔案的內容將消失。

$ cat 123.txt
123

$ ls -lhrt > 123.txt

$ cat 123.txt
total 20K
drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip
drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash
-rw-rw-r-- 1 rian rian  269 Feb 11 22:43 redirection.txt
-rw-rw-r-- 1 rian rian    0 Feb 11 22:50 123.txt
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cat-more-less
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cmd-bash

現在我們可以看到檔案 123.txt 的舊內容消失了。在這種情況下,我們必須使用“>>”來保留舊內容並追加重定向的內容。

$ cat 123.txt
123

$ ls -lhrt >> 123.txt

$ cat 123.txt
123
total 24K
drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip
drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash
-rw-rw-r-- 1 rian rian  269 Feb 11 22:43 redirection.txt
-rw-rw-r-- 1 rian rian    4 Feb 11 22:53 123.txt
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cat-more-less
drwxrwxr-x 2 rian rian 4.0K Feb 11  2016 cmd-bash

示例 3:從現有檔案重定向

我們還可以從現有檔案重定向併為任何命令提供輸入。讓我們看看下面的示例。在這裡,我們使用“grep”命令從檔案“123.txt”的內容中搜索“123”。

$ grep -i "123" < 123.txt
123
-rw-rw-r-- 1 rian rian    4 Feb 11 22:53 123.txt

示例 4:重定向 STDERR

我們可以使用“>”之前的“2”將僅錯誤重定向到檔案。

$ ls nofile.txt
ls: cannot access 'nofile.txt': No such file or directory

$ ls nofile.txt 2> error.txt

$ cat error.txt
ls: cannot access 'nofile.txt': No such file or directory

一個限制是,“error.txt”將僅包含 STDERR。如果我們希望在一個檔案中獲取 STDOUT 和 STDERR,則必須使用以下命令。讓我們看看步驟。

$ ls nofile.txt bash/
ls: cannot access 'nofile.txt': No such file or directory
bash/:
bash_function.sh  bash_pass_arg.sh  bash_return.sh  bash_return_usingglobal.sh  return3.sh

$ ls nofile.txt bash/ 2> error.txt
bash/:
bash_function.sh  bash_pass_arg.sh  bash_return.sh  bash_return_usingglobal.sh  return3.sh

$ cat error.txt
ls: cannot access 'nofile.txt': No such file or directory

$ ls nofile.txt bash > error.txt 2>&1

$ cat error.txt
ls: cannot access 'nofile.txt': No such file or directory
bash:
bash_function.sh
bash_pass_arg.sh
bash_return.sh
bash_return_usingglobal.sh
return3.sh

示例 1:使用單個和多個管道

我們可以將一個命令的輸出傳遞到後續命令以執行某些操作並獲得所需的輸出。讓我們看看下面的一個簡單示例。

$ ls
123.txt  bash  cat-more-less  cmd-bash  error.txt  redirection.txt  zip-unzip

$ ls | grep -i "bash"
bash
cmd-bash

我們可以看到命令從左到右流動。

可以在一行中使用多個管道來獲取所需的輸出。

$ ls | grep -i "bash" | wc -l
2

結論

透過本文,我們瞭解瞭如何在 Linux 中使用管道和重定向。

我們學習了以下運算子。

“>” , “>>”, “<”, “|”

這些命令有助於我們更快地操作並獲得預期的輸出。因此,根據需要,我們應該在 Linux 中使用相應的命令。

更新於: 2023-03-29

3K+ 閱讀量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.