Linux數(shù)據(jù)流重定向

部分轉自實驗樓。

  • > 會清空文件,然后將輸出寫入該文件。
  • >> 會把輸出添加到文件的末尾。
  • 同時,<和<<操作也是沒有問題的,它們的區(qū)別在于重定向的方向不一致而已,>表示是從左到右,<右到左。

簡單的重定向

文件描述符  設備文件      說明
0          /dev/stdin   標準輸入
1          /dev/stdout  標準輸出
2          /dev/stderr  標準錯誤

默認使用終端的標準輸入作為命令的輸入和標準輸出作為命令的輸出:

$ cat 
(按Ctrl+C退出)

將cat的連續(xù)輸出(heredoc方式,實時輸入到文件)重定向到一個文件

$ mkdir Documents
$ cat > Documents/test.c <<EOF
#include <stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

EOF

將一個文件作為命令的輸入,標準輸出作為命令的輸出

$ cat Documents/test.c

將echo命令通過管道傳過來的數(shù)據(jù)作為cat命令的輸入,將標準輸出作為命令的輸出

$ echo 'hi' | cat

將echo命令的輸出從默認的標準輸出重定向到一個普通文件

$ echo 'hello shiyanlou' > redirect
$ cat redirect

管道默認是連接前一個命令的輸出到下一個命令的輸入,而重定向通常是需要一個文件來建立兩個命令的連接

標準錯誤重定向

# 使用cat 命令同時讀取兩個文件,其中一個存在,另一個不存在
$ cat Documents/test.c hello.c
# 你可以看到除了正確輸出了前一個文件的內容,還在末尾出現(xiàn)了一條錯誤信息
# 下面我們將輸出重定向到一個文件
$ cat Documents/test.c hello.c > somefile
image.png

遺憾的是,這里依然出現(xiàn)了那條錯誤信息,這正是因為如我上面說的那樣,標準輸出和標準錯誤雖然都指向終端屏幕,實際它們并不一樣。那有的時候我們就是要隱藏某些錯誤或者警告,那又該怎么做呢。這就需要用到我們前面講的文件描述符了:

# 將標準錯誤重定向到標準輸出,再將標準輸出重定向到文件,注意要將重定向到文件寫到前面
$ cat Documents/test.c hello.c >somefile  2>&1
# 或者只用bash提供的特殊的重定向符號"&"將標準錯誤和標準輸出同時重定向到文件
$ cat Documents/test.c hello.c &>somefilehell

注意你應該在輸出重定向文件描述符前加上&,否則shell會當做重定向到一個文件名為1的文件中。

&1的含義就可以理解為用標準輸出的引用。為什么2>&1 要放在后邊呢? 是因為2(也就是錯誤輸出)要重定向到&1,也就是標準輸出的引用中,也就是標準輸出打開的文件中,所以需要現(xiàn)在前面打開1的輸出文件。

使用tee命令同時重定向到多個文件

你可能還有這樣的需求,除了需要將輸出重定向到文件,也需要將信息打印在終端。那么你可以使用tee命令來實現(xiàn):

$ echo 'hello shiyanlou' | tee hello
image.png

永久重定向

我們可以使用exec命令實現(xiàn)“永久”重定向。exec命令的作用是使用指定的命令替換當前的 Shell,即使用一個進程替換當前進程,或者指定新的重定向:

# 使用exec替換當前進程的重定向,將標準輸出重定向到一個文件
$ exec 1>somefile
# 后面你執(zhí)行的命令的輸出都將被重定向到文件中,直到你退出當前shell,或取消exec的重定向(后面將告訴你怎么做)
$ ls
$ exit
$ cat somefile
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容