關(guān)于linux bash的重定向
站在用戶的角度思考問題,與客戶深入溝通,找到吉安網(wǎng)站設(shè)計(jì)與吉安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋吉安地區(qū)。
所謂I/O重定向簡(jiǎn)單來說就是一個(gè)過程,這個(gè)過程捕捉一個(gè)文件,或者命令,程序,腳本,甚至腳本中的代碼塊(code block)的輸出,然后把捕捉到的輸出,作為輸入發(fā)送給另外一個(gè)文件,命令,程序,或者腳本。
如果談到I/O重定向,就涉及到文件標(biāo)識(shí)符(File Descriptor)的概念, 在Linux系統(tǒng)中,系統(tǒng)為每一個(gè)打開的文件指定一個(gè)文件標(biāo)識(shí)符以便系統(tǒng)對(duì)文件進(jìn)行跟蹤,這里有些和C語言編程里的文件句柄相似,文件標(biāo)識(shí)符是一個(gè)數(shù)字,不同數(shù)字代表不同的含義,默認(rèn)情況下,系統(tǒng)占用了3個(gè),分別是0標(biāo)準(zhǔn)輸入(stdin),1標(biāo)準(zhǔn)輸出(stdout), 2標(biāo)準(zhǔn)錯(cuò)誤(stderr), 另外3-9是保留的標(biāo)識(shí)符,可以把這些標(biāo)識(shí)符指定成標(biāo)準(zhǔn)輸入,輸出或者錯(cuò)誤作為臨時(shí)連接。通常這樣可以解決很多復(fù)雜的重定向請(qǐng)求。
標(biāo)準(zhǔn)輸入通常指鍵盤的輸入
標(biāo)準(zhǔn)輸出通常指顯示器的輸出
標(biāo)準(zhǔn)錯(cuò)誤通常也是定向到顯示器
請(qǐng)看以下例子,來描述一下他們的關(guān)系
#ls /dev
這個(gè)命令列出/dev目錄下的所有文件,在屏幕上輸出結(jié)果。
這里 /dev 就是作為命令ls的標(biāo)準(zhǔn)輸入(從鍵盤輸入),而打印在屏幕的結(jié)果就是標(biāo)準(zhǔn)輸出(/dev目錄中的內(nèi)容)
還是回到標(biāo)題,重定向就是把標(biāo)準(zhǔn)的`輸入或者輸出更改成其他的方式,請(qǐng)參看如下例子
或者等同于
#ls /dev 1filename #注意:"1"和""中間沒有空格
以上命令會(huì)把命令的標(biāo)準(zhǔn)輸出重新定向到一個(gè)文件filename,而不是顯示到屏幕上,如果不指明文件標(biāo)識(shí)符,系統(tǒng)默認(rèn)的就是1, 因此1可以省略
如果把上面例子重的""改成""則表示把輸出追加到filename文件的末尾,如果文件不存在則創(chuàng)建它。如下
#ls /dev filename
也可以把標(biāo)準(zhǔn)錯(cuò)誤重新定向到文件
#ls -qw /dev 2filename
顯然 -qw是一個(gè)錯(cuò)誤參數(shù),通常會(huì)在顯示器上報(bào)告一個(gè)錯(cuò)誤信息,但由于把2標(biāo)準(zhǔn)錯(cuò)誤(stderr)重新定向到了文件filename,因此顯示器沒有錯(cuò)誤信息,而信息寫到了文件里面
以下命令是把標(biāo)準(zhǔn)輸出和錯(cuò)誤都定向到文件
#ls /dev filename
""在這里代表標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,這里無論是正常輸出還是錯(cuò)誤信息都寫到filename中了。
重新定義標(biāo)準(zhǔn)輸入,輸出,和錯(cuò)誤的文件標(biāo)識(shí)符
重新定義文件標(biāo)識(shí)符可以用ij命令,表示把文件標(biāo)識(shí)符i重新定向到j(luò),你可以把""理解為"取地址"
請(qǐng)看以下例子
#exec 51
表示把文件標(biāo)識(shí)符5定向到標(biāo)準(zhǔn)輸出,這個(gè)命令通常用來臨時(shí)保存標(biāo)準(zhǔn)輸入。
同樣標(biāo)準(zhǔn)輸入也是可以重新定向的,請(qǐng)參考下面例子
# grep search-word
一般來說grep命令在給定文件中搜索字符串,以上命令把文件filename作為grep命令的標(biāo)準(zhǔn)輸入,而不是從鍵盤輸入。
前面曾經(jīng)提到,系統(tǒng)為每一個(gè)打開的文件指定一個(gè)文件標(biāo)識(shí)符以便系統(tǒng)對(duì)文件進(jìn)行跟蹤,那么默認(rèn)的文件標(biāo)識(shí)符是什么呢?答案是0,也就是標(biāo)準(zhǔn)輸入,或者可以說從鍵盤輸入。當(dāng)然這個(gè)文件標(biāo)識(shí)符也可以自己指定,請(qǐng)參考下面例子
#echo 123456789 filename 把字符串寫到文件filename中 #exec 3filename 把文件filename打開,并指定文件標(biāo)識(shí)符為3 #read -n 4 3 從文件中讀4個(gè)字符,句柄已經(jīng)指到第四個(gè)字符末尾 #echo -n . 3 在第5個(gè)字符處寫一個(gè)點(diǎn),覆蓋第5個(gè)字符,-n表示不換行 #exec 3- 關(guān)閉文件標(biāo)識(shí)符3
現(xiàn)在cat filename文件的結(jié)果就成了1234.6789
命令jfilename表示把文件打開,并指明文件標(biāo)識(shí)符為j
"-"表示關(guān)閉文件標(biāo)識(shí)符
有關(guān)關(guān)閉文件標(biāo)識(shí)符的操作請(qǐng)參考下面
n- 關(guān)閉輸入文件標(biāo)識(shí)符n 0-或- 關(guān)閉標(biāo)準(zhǔn)輸入stdin n- 關(guān)閉輸出文件標(biāo)識(shí)符n 1-或-關(guān)閉標(biāo)準(zhǔn)輸出stdout
另外還有一些其他命令,如下參考
2. : filename 或者 filename
表示把文件filename設(shè)置成空,也就是清空文件內(nèi)容,如果文件不存在,則創(chuàng)建一個(gè)空文件,(等同于touch命令) :表示一個(gè)空輸出,兩個(gè)命令的唯一區(qū)別就是filename不是在所有shell都可以正常工作的。
;
一個(gè)進(jìn)程默認(rèn)會(huì)打開標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出三個(gè)文件描述符
文件描述符為0,小于號(hào)表示數(shù)據(jù)由文件流入命令
usage:
命令 file
#加入輸入重定向,對(duì)輸入文件進(jìn)行計(jì)數(shù)
wc -l /etc/passwd
文件描述符為1,大于號(hào)表述數(shù)據(jù)由命令流入文件
所以: echo "hello" t.log 也可以寫成 echo "hello" 1 t.log
會(huì)把文件的內(nèi)容清空,再輸入到新的文件
會(huì)把當(dāng)前內(nèi)容保持不變,然后在下一行進(jìn)行追加
2 錯(cuò)誤重定向,如果當(dāng)前命令產(chǎn)生了錯(cuò)誤,會(huì)把錯(cuò)誤重定向到文件中,而不會(huì)打印到屏幕
無論內(nèi)容正確還是錯(cuò)誤都會(huì)把文件輸出到文件中。
stderr的文件描述符為2,Unix程序會(huì)向stderr流中寫入錯(cuò)誤信息。
默認(rèn)情況下, command file 將stdout 重定向到 file, command file 將stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以這樣寫:
$ command 2file
如果希望 stderr 追加到 file 文件末尾,可以這樣寫:
$ command 2file 2 表示標(biāo)準(zhǔn)錯(cuò)誤文件(stderr)
如果希望將 stdout 和 stderr 合并后重定向到 file,可以這樣寫:
$ command file 21 或者 $ command file 21
如果希望對(duì) stdin 和 stdout 都重定向,可以這樣寫:
$ command file1 file2
command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。
含義:將標(biāo)準(zhǔn)錯(cuò)誤輸出 重定向到 標(biāo)準(zhǔn)輸出。
符號(hào)是一個(gè)整體,不可分開,分開后就不是上述含義了。
比如有些人可能會(huì)這么想:2是標(biāo)準(zhǔn)錯(cuò)誤輸入,1是標(biāo)準(zhǔn)輸出,是重定向符號(hào),那么"將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到標(biāo)準(zhǔn)輸出"是不是就應(yīng)該寫成"21"就行了?是這樣嗎? 如果是嘗試過,你就知道21的寫法其實(shí)是將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到名為"1"的文件里去了
輸出即把相關(guān)對(duì)象通過輸出設(shè)備(顯示器等)顯示出來,輸出又分正確輸出和錯(cuò)誤輸出
一般情況下標(biāo)準(zhǔn)輸出設(shè)備為顯示器,標(biāo)準(zhǔn)輸入設(shè)備為鍵盤。
linux中用0代表標(biāo)準(zhǔn)輸入,1代表標(biāo)準(zhǔn)正確輸出,2代表標(biāo)準(zhǔn)錯(cuò)誤輸出。
輸出重定向:正常輸出是把內(nèi)容輸出到顯示器上,而輸出重定向是把內(nèi)容輸出到文件中
例如:ifconfig test.log 即把ifconfig執(zhí)行顯示的內(nèi)容寫入test.log.當(dāng)前頁面不再顯示執(zhí)行結(jié)果。
注意:錯(cuò)誤輸出重定向/后邊沒有空格
命令 文件 21 和 命令 文件 兩個(gè)命令作用相同
系統(tǒng)有個(gè)常見用法 ls /dev/null 正確輸出或錯(cuò)誤輸出結(jié)果都不要。(null可以理解為黑洞或垃圾站)
命令文件1 2文件2 正確日志和錯(cuò)誤日志分開保存
例:nohup java -jar /usr/sbin/lb-agent.jar /var/log/lb-agent.log 21
將jar執(zhí)行的結(jié)果寫入到lb-agent.log中
在命令最后加上符號(hào),表示讓這個(gè)進(jìn)程到后臺(tái)去執(zhí)行,這樣立刻返回到提示符狀態(tài),我們可以接著做下面的事。如:command 。
這種“后臺(tái)”進(jìn)程在shell一直打開的情況下是沒有問題的,如果我們關(guān)了shell窗口甚至退出ssh登錄或vnc登錄,那么進(jìn)程自動(dòng)就結(jié)束了。所以如果想退出窗口乃至退出登錄仍然保持程序運(yùn)行,再加上nohup,形如:nohup command 1output 21 ??《Linux就該這么學(xué)》學(xué)習(xí)更多l(xiāng)inux知識(shí)。
IO 重定向是為了改變默認(rèn)輸入、輸出的位置,如默認(rèn)情況下標(biāo)準(zhǔn)輸出(STDOUT),標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)都是輸出到顯示終端,如對(duì)標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出改變其默認(rèn)輸出位置,可重定向輸出到指定的文件中(實(shí)際工作中經(jīng)常這么使用),要重定向就要配合一些語法符號(hào)。
文件或目錄的訪問權(quán)限分為只讀、只寫、可執(zhí)行三種。
修改文件權(quán)限命令:chmod、chgrp、chown。
搞懂「文件所屬者更改及權(quán)限的賦予」,涉及關(guān)于 chown、chmod、chgrp 命令,結(jié)合用例零基礎(chǔ)理解和掌握使用。
重定向:人為干預(yù)決定輸出結(jié)果的位置【輸出到文件還是控制臺(tái)】
比如 :
ls /aaaaa # 不存在aaaaa這個(gè)目錄,會(huì)報(bào)錯(cuò)
返回
要將1和2的結(jié)果都放到bbb中,需要首先將1重定向到bbb文件,即
ls / /aaaaaa 1bbb 21
或者
ls / /aaaaaa bbb #特殊寫法而已,不用深究
或者
ls / /aaaaaa bbb #特殊寫法而已,不用深究
返回
從一個(gè)字符串讀數(shù)據(jù)、給定結(jié)束符自己輸數(shù)據(jù)、從文件進(jìn)行輸入
也可以放到文件中執(zhí)行,shell_eg.sh中的內(nèi)容如下
cat aaa rg 或者 cat rg aaa
cat aaa
返回
注:read是讀取的,不是輸出,不能把結(jié)果重定向到文件