五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

玩轉(zhuǎn)Linux文件描述符和重定向

發(fā)布日期:2022-03-19 10:43 | 文章來(lái)源:站長(zhǎng)之家

linux下的文件描述符是與文件輸入、輸出相關(guān)聯(lián)的整數(shù)。它們用來(lái)跟蹤已打開(kāi)的文件。
最常見(jiàn)的文件描述符是stdin、stdout和stderr.我們可以將某個(gè)文件描述符的內(nèi)容重定向到另一個(gè)文件描述符中。

下面給出一些對(duì)文件描述符進(jìn)行操作和重定向的例子。

1.5.1 預(yù)備知識(shí)

我們?cè)诰帉?xiě)腳本時(shí)會(huì)頻繁使用標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr)。

通過(guò)內(nèi)容過(guò)濾將輸出重定向到文件是我們從事的基礎(chǔ)任務(wù)之一。

當(dāng)命令輸出文本時(shí),這些輸出文本有可能是錯(cuò)誤信息,也可能是正常的(非錯(cuò)誤的)輸出信息。
單靠查看輸出的文本本身, 我們無(wú)法區(qū)分哪些是正常的輸出文本,哪些是錯(cuò)誤文本。不過(guò),我們可以通過(guò)文件描述符來(lái)解決這個(gè)問(wèn)題,將那些與特定描述符關(guān)聯(lián)的文本提取出來(lái)。
文件描述符是與一個(gè)打開(kāi)的文件或數(shù)據(jù)流相關(guān)聯(lián)的整數(shù)。文件描述符0、1以及2是系統(tǒng)預(yù)留的。
0——stdin(標(biāo)準(zhǔn)輸入)
1——stdout(標(biāo)準(zhǔn)輸出)
2——stderr(標(biāo)準(zhǔn)錯(cuò)誤)

1.5.2 實(shí)戰(zhàn)演練

將輸出文本重定向或保存到一個(gè)文件中:


復(fù)制代碼
代碼如下:

$echo"This is a sample text 1">temp.txt

這種方法通過(guò)截取文件的方式,將輸出文本存儲(chǔ)到文件temp.txt中,也就是說(shuō)在把echo命令的輸出寫(xiě)入文件之前,temp.txt中的內(nèi)容首先會(huì)被清空。
接下來(lái),再看另一個(gè)例子:


復(fù)制代碼
代碼如下:

$echo "this is sample text 2" >>temp.txt

這種方法會(huì)將文本追加到目標(biāo)文件中。
>和>>并不相同。盡管這兩個(gè)操作符都可以將文本重定向到文件,但是前者會(huì)先清空文件,再寫(xiě)入內(nèi)容;而后者會(huì)將內(nèi)容追加到現(xiàn)有文件的尾部。
可以用下面的方法查看文件內(nèi)容:


復(fù)制代碼
代碼如下:

$cat temp.txt
this is sample text 1
this is sample text 2

在linux操作系統(tǒng)中,當(dāng)使用重定向操作符時(shí),重定向的內(nèi)容不會(huì)出現(xiàn)在終端,而是直接被導(dǎo)入文件。重定向操作符默認(rèn)使用標(biāo)準(zhǔn)輸出。如果想使用特定的文件描述符,你必須將描述符置于操作符之前。

>等同于1>;對(duì)于>>來(lái)說(shuō),情況也類似(即>>等同于1>>)。
來(lái)看看什么是標(biāo)準(zhǔn)錯(cuò)誤以及如何對(duì)它重定向。當(dāng)命令輸出錯(cuò)誤信息時(shí),stderr信息就會(huì)被打印出來(lái)??紤]下面的例子:


復(fù)制代碼
代碼如下:

$ Is +
Is:cannot access +:No such file or directory

這里,+是一個(gè)非法參數(shù),因些將返回錯(cuò)誤信息。
[ 成功和不成功的命令
當(dāng)一個(gè)命令發(fā)生錯(cuò)誤并退回時(shí),它會(huì)返回一個(gè)非0的退出狀態(tài);而當(dāng)命令成功完成后,它會(huì)返回?cái)?shù)字0。退出狀態(tài)可以從特殊變量$? 中獲得(在命令執(zhí)行語(yǔ)句之后立刻運(yùn)行echo$?,就可以打印出退出狀態(tài))。]

將stderr文本打印到屏幕上,而不是文件中。


復(fù)制代碼
代碼如下:

$ Is+>out.txt
Is:cannot access+:No such file or directory

然而在下面的命令中,stdout沒(méi)有任何輸出,因?yàn)殄e(cuò)誤已經(jīng)重定向到out.txt中去了。


復(fù)制代碼
代碼如下:

$ Is +2> out.txt # 正常運(yùn)行

你可以將stderr單獨(dú)重定向到一個(gè)文件,將stdout重定向到另一個(gè)文件:


復(fù)制代碼
代碼如下:

$ cmd 2>stderr.txt 1>stdout.txt

還可以利用下面的方法將stderr轉(zhuǎn)換成stdout,使得stderr和stdout都被重定向到同一個(gè)文件中:


復(fù)制代碼
代碼如下:

$ cmd 2>&1 output.txt

或者采用下列方法:


復(fù)制代碼
代碼如下:

$ cmd&> output.txt

有時(shí)候,在輸出中可能包含一些不必要的信息(比如除錯(cuò)信息)。如果你不想讓終端中充斥著有關(guān)stderr的繁枝末節(jié),那么你可以將stderr的輸出重定向到/dev/null, 保證一切都會(huì)被清除得干干凈凈。假設(shè)我們有三個(gè)文件,分別是a1、a2、a3。但是普通用戶對(duì)a1沒(méi)有“讀一寫(xiě)一執(zhí)行”權(quán)限。如果你需要打印文件名以a起始的所有文件的內(nèi)容,你可以使用cat命令。
設(shè)置一些測(cè)試文件:


復(fù)制代碼
代碼如下:

$ echo a1 >a1
$ cp a1 a2;cp a2 a3;
$ chmod 000 a1 #清除所有權(quán)限

盡管可以使用通配符(a*)顯示所有的文件內(nèi)容,但是系統(tǒng)會(huì)顯示一個(gè)出錯(cuò)信息,因?yàn)閷?duì)文件a1沒(méi)有可讀權(quán)限。


復(fù)制代碼
代碼如下:

$ cat a*
cat:a1 permission denied
a1
a1

其中,cat:a1:permission denied 屬于stderr。我們可以將stderr信息重定向到一個(gè)文件中,而stdout 仍然保持不變。考慮如下代碼:


復(fù)制代碼
代碼如下:

$ cat a* 2>err.txt #stderr被重定向到err.txt
a1
a1
$ cat err.txt
cat:a1:permission denied

觀察下面的代碼:


復(fù)制代碼
代碼如下:

$ some_command 2>/dev/null

本節(jié)是 玩轉(zhuǎn)Linux文件描述符和重定向 第二頁(yè)的內(nèi)容,歡迎大家繼續(xù)閱讀。

在這個(gè)示例中,來(lái)自stderr的輸出被丟到文件/dev/null中。/dev/null是一個(gè)特殊的設(shè)備文件,這個(gè)文件接收到的任何數(shù)據(jù)都會(huì)被丟棄。

因此,null設(shè)備通常也被為位桶(bit bucket)或黑洞。
當(dāng)對(duì)stderr或stdout進(jìn)行重定向時(shí),重定向的文本將傳入文件。

因?yàn)槲谋疽呀?jīng)被重定向到文件中,也就沒(méi)剩下什么東西可以通過(guò)管道(|)傳給接下來(lái)的命令,而這些命令是通過(guò)stdin來(lái)接收文本的。
但是有一個(gè)巧妙的方法可以一方面將數(shù)據(jù)重定向到文件,另一方面還可以提供一些重定向數(shù)據(jù)的副本作為后續(xù)命令的stdin。

這一切都可以使用tee來(lái)實(shí)現(xiàn)。

舉個(gè)例子:要在終端中打印stdout,同時(shí)將它重定向到一個(gè)文件中,那么可以這樣使用tee:


復(fù)制代碼
代碼如下:

command | tee FILE1 FILE2

在下面的代碼中,tee命令接收到來(lái)自stdin的數(shù)據(jù)。它將stdout的一份副寫(xiě)入文件out.txt,同時(shí)將別一份副本作為后續(xù)命令的stdin。命令cat -n將從stdin中接收到的每一行數(shù)據(jù)前加上行號(hào)并寫(xiě)入stdout:


復(fù)制代碼
代碼如下:

$ cat a*| tee out.txt| cat -n
cat: a1: permission denied
1 a1
2 a1

查看out.txt 的內(nèi)容:


復(fù)制代碼
代碼如下:

$ cat out.txt
a1
a1

注意,cat:a1:permission denied并沒(méi)有在任何文件內(nèi)容中出現(xiàn)。這是因?yàn)檫@些信息屬于stderr,而tee只能從stdin中進(jìn)行讀取。
默認(rèn)情況下,tee命令會(huì)將文件覆蓋,但是提供了一個(gè)-a選項(xiàng),可以用于追加內(nèi)容。例如:


復(fù)制代碼
代碼如下:

$ cat a*| tee -a out.txt| cat -n.

帶有參數(shù)的命令可以寫(xiě)成:command FILE1 FILE2依次類推,或者簡(jiǎn)簡(jiǎn)單單地用command FILE。
我們可以使用stdin作為命令參數(shù)。只需要將-作為命令的文件名參數(shù)即可:


復(fù)制代碼
代碼如下:

$ cmd1 |cmd2 |cmd -

例如:


復(fù)制代碼
代碼如下:

$ echo who is this | tee-
who is this
who is this

或者我們也可以將/dev/stdin作為輸出文件名來(lái)使用stdin。
類似的,使用/dev/stderr代表標(biāo)準(zhǔn)錯(cuò)誤,/dev/stdout代表標(biāo)準(zhǔn)輸出。這些特殊的設(shè)備文件分別對(duì)應(yīng)stdin、stderr和stdout。

補(bǔ)充內(nèi)容:
從stdin讀取輸入的命令能以多種方式接收數(shù)據(jù)。另外,還可以用cat和管道來(lái)制定我們自己的文件描述符,例如:


復(fù)制代碼
代碼如下:

$ cat file | cmd
$ cmd1 | cmd2

1.將文件重定向到命令
借助重定向,我們可以像使用stdin那樣從文件中讀取數(shù)據(jù):


復(fù)制代碼
代碼如下:

$ cmd <file

2.重定向腳本內(nèi)部的文本塊
有時(shí)候,需要對(duì)文本塊(多行文本)像標(biāo)準(zhǔn)輸入一樣進(jìn)行重定向??紤]一個(gè)特殊情況:源文本就位于shell腳本中。

來(lái)看下面這段shell腳本吧,向log文件中寫(xiě)入頭部數(shù)據(jù),可以按照下面的方法完成:


復(fù)制代碼
代碼如下:

#!/bin/bash
cat <<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics
EOF

在cat <<EOF>log.txt與下一個(gè)EOF行之間的所有文本行都會(huì)被當(dāng)做stdin數(shù)據(jù)。log.txt文件的內(nèi)容打印如下:


復(fù)制代碼
代碼如下:

$ cat log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics

海外穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部