Shell--呈現(xiàn)數(shù)據(jù)

文件描述符

#文件描述符來標(biāo)識(shí)每個(gè)文件對(duì)象蚓再,唯一的標(biāo)識(shí)會(huì)話中打開的文件
#0 stdin 1 stdout 2 stderr
#使用<時(shí),Linux會(huì)用重定向指定的文件替換標(biāo)準(zhǔn)輸入文件描述符
#命令行中只輸入cat命令靶庙,它會(huì)接受stdin 的輸入
#也可以使用重定向符號(hào)接受非stdin的輸入
cat < testfile
#輸出重定向來改變輸出,將顯示到顯示器的輸出定向到指定的重定向文件
ls -l > test2
#追加數(shù)據(jù)
who >> test2
#shell處理錯(cuò)誤消息和處理普通輸出是分開的
#默認(rèn)情況下娃属,stdout,stderr文件描述符指向同樣的地方,顯示器
#重定向錯(cuò)誤
#只重定向錯(cuò)誤,2>是緊連在一起的
ls -al badfile 2> test4
#重定向錯(cuò)誤和數(shù)據(jù)
#在重定向的每個(gè)數(shù)據(jù)前添加對(duì)應(yīng)的文件描述符掏击,將它們指向?qū)?yīng)的保存數(shù)據(jù)的輸出文件
ls -al test test2 test3 badtest 2> test6 1> test7
#同樣也可以將stderr和stdout輸出重定向到同一個(gè)輸出文件
ls -al test test2 test3 badtest &> test7
#bash shell會(huì)自動(dòng)給錯(cuò)誤消息分配較標(biāo)準(zhǔn)輸出來說更高的優(yōu)先級(jí)
#這樣就可以在一處地方查看錯(cuò)誤消息了```

###腳本中重定向輸出

用stdout和stderr文件描述符來在多個(gè)位置生成輸出秩铆,重定向相應(yīng)的文件描述符

臨時(shí)重定向

在腳本中生成錯(cuò)誤消息,將某一行輸出重定向到stderr

echo "this is an error message" >&2

所以如果腳本重定向了stderr捅膘,就會(huì)將上條消息輸出到重定向的文件

./test8 2> test9```

永久重定向

#exec命令使shell在腳本執(zhí)行期間重定向某個(gè)特定文件描述符
#重定向每個(gè)echo語句
exec 1>testout
echo "this is a test"
#exec命令會(huì)啟動(dòng)一個(gè)新shell并且將stdout文件描述符重定向到文件
#腳本中發(fā)給stdout的所有輸出都會(huì)被重定向到文件
exec 2>testerror
echo "this is the start of the script"
exec 1>testout
echo "i love you"
echo "but this should go to the testerror file" >&2
#因此這里testout會(huì)包含正常信息滚粟,testerror則包含錯(cuò)誤信息
#在定義1>testout之前的echo還是會(huì)輸出到屏幕上的```

###在腳本中重定向輸入

exec命令將stdin重定向到linux系統(tǒng)上的文件中

!/bin/bash

exec 0< testfile
count=1
while read line;do
echo "line #$count: $line"
count=$[ $count + 1 ]
done

讀取日志文件的最簡(jiǎn)單辦法```

創(chuàng)建輸出文件描述符

#shell中最多可以有9個(gè)打開的文件描述符坦刀,另外6個(gè)是3-8
exec 3>test13out
echo "this should display on the monitor"
echo "and this should be stored in the file" >&3
echo "then this should be back on the monitor"
#可以使用exec命令來輸出追加到現(xiàn)有文件
exec 3>>test13out```

###重定向文件描述符

將文件描述符3重定向到文件描述符1的位置,也就是顯示器

類似于引用沐寺,顯示器的引用盖奈,重定向文件的引用

exec 3>&1

將文件描述符1重定向到文件,但是3仍然指向顯示器

exec 1>test14out
echo "this should store in the output file"
echo "along with this line"

將1重定向3的位置钢坦,也就是顯示器

exec 1>&3
echo "now things should be back to normal"```

創(chuàng)建輸入文件描述符

#先將stdin文件描述符保存到另外一個(gè)文件描述符爹凹,讀取完重定向文件后再恢復(fù)
exec 6<&0
exec 0< testfile
count=1
while read line;do
    echo "Line #$count: $line"
    count=$[ $count + 1 ]
done
exec 0<&6
read -p "are you done now?" answer
case $answer in
    y|Y) echo "goodbye";;
    N|n) echo "sorry, this is the end";;
esac```

###創(chuàng)建讀寫文件描述符

使用同一個(gè)文件描述符來從文件中讀寫數(shù)據(jù)

exec 3<> testfile
read line <&3
echo "Read: $line"
echo "this is a test line" >&3

因?yàn)閟hell中會(huì)維護(hù)一個(gè)讀寫文件的位置指針

因此讀取之后,指針的位置將作為下一次讀寫的位置

如果寫入的話微酬,就會(huì)從這個(gè)位置開始覆蓋原有的數(shù)據(jù)```

關(guān)閉文件描述符

#shell會(huì)在腳本退出時(shí)自動(dòng)關(guān)閉它們
#手動(dòng)關(guān)閉文件描述符
exec 3>&-
#下面是一個(gè)例子,最后會(huì)出現(xiàn)錯(cuò)誤陷遮,一旦關(guān)閉了垦江,就不能再使用了
exec 3> test17file
echo "this is a test line of data" >&3
exec 3>&-
echo "this won't work" >&3```

###列出打開的文件描述符

lsof -a -p $$ -d 0,1,2

-a選項(xiàng)是對(duì)后面兩個(gè)選項(xiàng)的結(jié)果執(zhí)行布爾and運(yùn)算

-p指定進(jìn)程PID,$$表示當(dāng)前進(jìn)程的PID

-d表示允許指定要顯示的文件描述符的個(gè)數(shù)

FD那一列中绽族,數(shù)字表示文件描述符梗逮,u表示讀寫,w表示寫慷彤,r表示讀```

阻止命令輸出

ls -al > /dev/null
#阻止任何錯(cuò)誤消息但是不保存
ls -al badfile test16 2> /dev/null
#也可以在輸入重定向?qū)?dev/null作為輸入文件
#從而快速移除現(xiàn)有的文件中的數(shù)據(jù)而不用先刪除文件再創(chuàng)建底哗,bingo
cat /dev/null > testfile```

###創(chuàng)建本地臨時(shí)文件

mktemp會(huì)在本地目錄中創(chuàng)建一個(gè)臨時(shí)文件

指定文件名模板,

mktemp testing.XXXXXX

mktemp會(huì)用6個(gè)字符碼替換這6個(gè)X跋选,保證文件名在目錄中是唯一的前标,返回文件名

將文件名保存到變量中,就可以在后面腳本中引用了

tempfile=mktemp test19.XXXXXX
exec 3>$tempfile
echo "this script writes to temp file $tempfile"
echo "this is the first line" >&3
echo "this is the second line" >&3
exec 3>&-
echo "done creating temp file, the contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null```

在/tmp目錄創(chuàng)建臨時(shí)文件

#-t選項(xiàng)會(huì)在系統(tǒng)的臨時(shí)目錄創(chuàng)建文件炼列,返回全路徑
mktemp -t test.XXXXXX
#比如返回/tmp/test.XG3374
tempfile=`mktemp -t tmp.XXXXXX`
echo "this is a test file" > $tempfile
echo "this is the second line" >> $tempfile
echo "the temp file is located at: $tempfile"
cat $tempfile
rm -f $tempfile```

###創(chuàng)建臨時(shí)目錄

-d選項(xiàng)使其創(chuàng)建一個(gè)臨時(shí)目錄

tempdir=mktemp -d dir.XXXXXX
cd $tempdir
tempfile1=mktemp temp.XXXXXX
tempfile2=mktemp temp.XXXXXX
exec 7> $tempfile1
exec 8> $tempfile2
echo "sending data to directory $tempdir"
echo "this is a test line of data for $tempfile1" >&7
echo "this is a test line of data for $tempfile2" >&8```

tee命令

#將stdin過來的數(shù)據(jù)重定向
date | tee testfile
#默認(rèn)情況下俭尖,tee命令會(huì)在每次使用時(shí)覆蓋輸出文件內(nèi)容
#使用-a來將數(shù)據(jù)追加過去
date | tee -a testfile```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稽犁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子已亥,更是在濱河造成了極大的恐慌,老刑警劉巖震鹉,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件足陨,死亡現(xiàn)場(chǎng)離奇詭異娇未,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)零抬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門平夜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忽妒,你說我怎么就攤上這事〕越Γ” “怎么了鸯檬?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵喧务,是天一觀的道長。 經(jīng)常有香客問我功茴,道長,這世上最難降的妖魔是什么肄扎? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任赁酝,我火速辦了婚禮,結(jié)果婚禮上衡载,老公的妹妹穿的比我還像新娘隙袁。我一直安慰自己弃榨,他們只是感情好梨睁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坡贺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拳亿。 梳的紋絲不亂的頭發(fā)上愿伴,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音鹅经,去河邊找鬼官帘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刽虹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胖缤,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼哪廓,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼初烘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肾筐,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吗铐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后唬渗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奋渔,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉鲸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年歹啼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡份企,死狀恐怖巡莹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骂远,我是刑警寧澤腰根,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站瘸恼,受9級(jí)特大地震影響册养,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜球拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一坎炼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧点弯,春花似錦、人聲如沸狼钮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涎拉。三九已至,卻和暖如春鼓拧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钮糖。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工酌住, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人消痛。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓都哭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稠歉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汇陆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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