部分轉自實驗樓。
- > 會清空文件,然后將輸出寫入該文件。
- >> 會把輸出添加到文件的末尾。
- 同時,<和<<操作也是沒有問題的,它們的區(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