通過重定向在Linux終端任意讀寫數(shù)據(jù)
重定向是一種十分高效的數(shù)據(jù)流動方式,它能幫你減少很多鼠標(biāo)和鍵盤上的操作。
對于任何編程或腳本語言,輸入與輸出重定向都是很自然的功能。嚴(yán)格來說,當(dāng)你使用電腦時,數(shù)據(jù)自然而然地在發(fā)生著重定向。從 stdin
(標(biāo)準(zhǔn)輸入,通常是你的鍵盤或者鼠標(biāo))讀取輸入,輸入則發(fā)往 stdout
(標(biāo)準(zhǔn)輸出,一段文本或者數(shù)據(jù)流),最后錯誤信息送至 stderr
。如果你使用 Bash 或 Zsh 之類的 shell,那么理解這些數(shù)據(jù)流能夠讓你更好地控制信息流向。
標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯誤輸出都存在于 Linux 文件系統(tǒng)中。你可以在 /dev
查看:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
你可能沒法直接使用它們,但將它們想象成你能傳遞數(shù)據(jù)的元位置,會很有幫助。
重定向的基礎(chǔ)很簡單:用一些 >
符號重定向輸出,然后用另外一些 <
符號重定向輸入。
重定向輸出
將 ls 命令的輸出寫入一個文件:
$ ls > list.txt
你沒法像平常那樣看到 ls
的輸出,因?yàn)樗鼈儾]有被發(fā)送到屏幕,而是被寫入 list.txt
文件了,這個功能用處太多了,事實(shí)上,你甚至可以用它來將文件內(nèi)容拷貝到另一個文件。不一定是文本文件,你也可以用將重定向用于二進(jìn)制數(shù)據(jù):
$ cat image.png > picture.png
(你可能會好奇為什么要這樣做,有時候?qū)τ?nbsp;文件權(quán)限信息 而間接有用。)
重定向輸入
你也能將輸入重定向“到”一個命令。可以說,它沒有重定向輸出那么有用,因?yàn)樵S多命令已經(jīng)被硬編碼,只從你的參數(shù)中接收輸入。但是,如果某個命令需要一系列參數(shù),而且你把這些參數(shù)寫在文件里,想要快速“復(fù)制粘貼”到終端的時候(除非你并不想復(fù)制粘貼),它就幫得上忙了。
$ sudo dnf install $(<package.list)
重定向輸入得常規(guī)用法是嵌入文檔(簡寫成 here-doc)和嵌入字符串 技巧。這種輸入方法將一整塊文本重定向至標(biāo)準(zhǔn)輸入流,直到碰見一個特殊的文件結(jié)束標(biāo)記(許多人習(xí)慣用 EOF
,實(shí)際上你可以使用任何字符串,只要它是唯一的)。試著把這些(在第二個 EOF
標(biāo)記之前)敲進(jìn)你的終端:
$ echo << EOF
> foo
> bar
> baz
> EOF
輸出結(jié)果:
foo
bar
baz
使用 Bash 編寫腳本的人常常用這個技巧,將數(shù)行文本一次性寫入文件或者打印到屏幕上。只要你別忘了末尾的文件結(jié)束標(biāo)記,這會是一個幫你避免大量繁瑣 echo
或 printf
語句的好辦法。
嵌入字符串類似于嵌入文檔,但是它只含有一個字符串(或者用引號包裹的幾個字符串,同樣會被當(dāng)成一個字符串)
$ cat <<< "foo bar baz"
foo bar baz
重定向錯誤信息
錯誤信息流叫做 stderr
,通過 2>
實(shí)現(xiàn)這個目的。下面這個命令把錯誤信息定向到 output.log
文件:
$ ls /nope 2> output.log
將數(shù)據(jù)送往 /dev/null
既然標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯誤輸出都有自己的位置,那么“空空如也”也應(yīng)該在 Linux 文件系統(tǒng)占有一席之地。沒錯,它叫做 null
,位于 /dev
,頻繁使用的人懶得說 “slash dev slash null”,于是索性叫它 “devnull”。
通過重定向,你可以把數(shù)據(jù)發(fā)送到 /dev/null
。比如,find
命令常常會輸出很多具體信息,而且在搜索文件遇到權(quán)限沖突時,會事無巨細(xì)地報(bào)告:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
find
命令把那些當(dāng)作錯誤,所以你可以只把錯誤信息重定向至 /dev/null
:
$ find ~ -type f 2>; /dev/null
/home/seth/actual.file
/home/seth/zzz.file
使用重定向
在 Bash 中,重定向是轉(zhuǎn)移數(shù)據(jù)的有效方法。你可能不會頻繁使用重定向,但是學(xué)會如何使用它,能幫你在打開文件、復(fù)制粘貼數(shù)據(jù)這類需要移動鼠標(biāo)、大量按鍵操作上,節(jié)省很多不必要的時間。不要做如此浪費(fèi)時間的事情。使用重定向,好好享受生活。