Shell 重定向(四):文件描述符

Shell 有時會引用使用文件描述符(fd)的文件扑媚。我們一般使用文件描述符(fd)的范圍是數(shù)字 0~9盆赤。重定向時大于 9 的文件描述符要謹(jǐn)慎使用霉祸,因為它們可能與 Shell 內(nèi)部使用的文件描述符沖突脐湾。

文件描述符可以包含多個數(shù)字位乳乌。例如捧韵,文件描述符 001 和 01 與文件描述符 1 是相同的。多種操作(例如汉操,exec 命令)都可以將文件描述符與特定的文件聯(lián)系起來再来。

有些文件描述符是在 Shell 啟動時被建立的,這就是我們前面介紹的標(biāo)準(zhǔn)輸入磷瘤、標(biāo)準(zhǔn)輸出和標(biāo)注錯誤(0芒篷、1、2)文件描述符采缚。

實例:使用 exec 命令

Bash 的內(nèi)部命令 exec 的功能之一就是允許我們操作文件描述符针炉。如果在 exec 之后沒有指定命令,則 exec 命令之后的重定向?qū)⒏漠?dāng)前 Shell 的文件描述符扳抽。

例如篡帕,在命令 “exec 2> file” 之后運行的所有命令,都會將其產(chǎn)生的錯誤信息發(fā)送到文件 file 中贸呢,就像你的命令在腳本 myscript.sh 中镰烧,而你運行的是 “./myscript.sh >2 file”。

比如楞陷,如果你想記錄腳本中的命令產(chǎn)生的錯誤信息怔鳖,就可以在腳本的開頭使用類似如下的命令:

exec 2> errors.log

下面我們來看一個腳本文件,在這個腳本中我們想要順序地讀取文件中的每一行猜谚,并在打印每一行之后败砂,等待用戶輸入任意鍵后繼續(xù)赌渣。

#! /bin/bash

if [ $# -lt 1 ]; then
    echo "Usage: $0 FILEPATH"
    exit
fi

file=$1

while read -r line
do
    echo $line
    read -p "Press any key" -n 1
done < $file
運行結(jié)果

從上面的輸出結(jié)果我們可以看到,read 語句并沒有執(zhí)行:因為我們將指定的文件重定向到了 while 循環(huán)的標(biāo)準(zhǔn)輸入(文件描述符 0)昌犹,即我們指定的文件將被打開以用于標(biāo)準(zhǔn)輸入的讀取坚芜,而循環(huán)中的所有命令包括 read 命令都會繼承這個文件描述符(這里是標(biāo)準(zhǔn)輸入),因此 read 將從重定向后的標(biāo)準(zhǔn)輸入讀取斜姥,而不是從默認(rèn)的標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)讀取鸿竖。

而此時,我們就可以使用 exec 命令對腳本稍加改動铸敏,來實現(xiàn)我們想要的功能缚忧,改動后的腳本將類似如下所示:

#! /bin/bash

if [ $# -lt 1 ]; then
    echo "Usage: $0 FILEPATH"
    exit
fi

# 將腳本的第一個參數(shù)作為輸入文件,并制定一個文件描述符 3
exec 3< $1

while read -u 3 line
do
    echo $line
    read -p "Press any key: " -n 1
done

# 關(guān)閉文件描述符 3
exec 3<&-

在上述腳本中杈笔,我們使用的 “read -u 3 line” 命令闪水,為 read 指定從指定的描述符中讀取數(shù)據(jù)。

上述腳本的運行效果

運行結(jié)果

本文參考自 《Linux Shell命令行及腳本編程實例詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒙具,一起剝皮案震驚了整個濱河市球榆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禁筏,老刑警劉巖持钉,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篱昔,居然都是意外死亡每强,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門州刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來空执,“玉大人,你說我怎么就攤上這事穗椅〈嘌蹋” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵房待,是天一觀的道長。 經(jīng)常有香客問我驼抹,道長桑孩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任框冀,我火速辦了婚禮流椒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘明也。我一直安慰自己宣虾,他們只是感情好惯裕,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绣硝,像睡著了一般蜻势。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹉胖,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天握玛,我揣著相機(jī)與錄音,去河邊找鬼甫菠。 笑死挠铲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寂诱。 我是一名探鬼主播拂苹,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痰洒!你這毒婦竟也來了瓢棒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤带迟,失蹤者是張志新(化名)和其女友劉穎音羞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓犬,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗅绰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀继。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘面。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叽躯,靈堂內(nèi)的尸體忽然破棺而出财边,到底是詐尸還是另有隱情,我是刑警寧澤点骑,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布酣难,位于F島的核電站,受9級特大地震影響黑滴,放射性物質(zhì)發(fā)生泄漏憨募。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一袁辈、第九天 我趴在偏房一處隱蔽的房頂上張望菜谣。 院中可真熱鬧,春花似錦、人聲如沸尾膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈敛。三九已至待笑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莺债,已是汗流浹背滋觉。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留齐邦,地道東北人椎侠。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像措拇,于是被迫代替她去往敵國和親我纪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容