shell初級-----資料呈現方式

秦廣王發表於2019-05-23

輸入與輸出

Linux系統將每個物件當作檔案處理,這包括輸入和輸出程式。
Linux用檔案描述符來標識每個檔案物件。
檔案描述符是一個非負整數,可以唯一標識會話中開啟的檔案。
每個程式一次多可以有九個檔案描述符。出於特殊目的,bash shell保留了前三個檔案描述符(0、1和2)

Linux的標準檔案描述符

 

 

 

這三個特殊檔案描述符會處理指令碼的輸入和輸出。

1、stdin

STDIN檔案描述符代表shell的標準輸入
在使用輸入重定向符號(<)時,Linux會用重定向指定的檔案來替換標準輸入檔案描述符。 它會讀取檔案並提取資料,就如同它是鍵盤上鍵入的。

[root@node1 ljy]# cat < one.txt 
one
two
three

2、stdout

STDOUT檔案描述符代表shell的標準輸出

[root@node1 ljy]# date > time.txt
[root@node1 ljy]# more time.txt 
2019年 05月 16日 星期四 10:08:51 CST
[root@node1 ljy]# date >> time.txt   #>>表示追加的意思
[root@node1 ljy]# more time.txt   
2019年 05月 16日 星期四 10:08:51 CST
2019年 05月 16日 星期四 10:09:01 CST

3、stderr

shell通過特殊的STDERR檔案描述符來處理錯誤訊息。

預設情況下,錯誤訊息也會輸出到顯示器輸出中。

[root@node1 ljy]# aaaa 2> err.txt       
[root@node1 ljy]# more err.txt 
-bash: aaaa: 未找到命令

#shell會只定向錯誤訊息而非普通的資料。

如果想要同時定義普通與錯誤的訊息可以用兩個重定向符的方式:

[root@node1 ljy]# ls -al one two 2> err.txt 1> normal.txt
[root@node1 ljy]# more err.txt 
ls: 無法訪問two: 沒有那個檔案或目錄
[root@node1 ljy]# more normal.txt 
-rw-r--r-- 1 root root 0 5月  16 10:17 one

bash也提供了特殊的重定向符實現這一個效果&>。

[root@node1 ljy]# ls -al one two &> ceshi.txt            
[root@node1 ljy]# more ceshi.txt 
ls: 無法訪問two: 沒有那個檔案或目錄
-rw-r--r-- 1 root root 0 5月  16 10:17 one
#生成的所有輸出都會到同一位置,包括普通與錯誤。預設錯誤訊息會處於更高的優先順序,方便檢視。

指令碼中重定向輸出

 1、臨時重定向

希望在指令碼中生成錯誤的資訊的話,可以單獨的一行輸出重定向到STDERR。重定向到檔案描述時,你必須在檔案描述符數字前加一個&符號。

[root@node1 ljy]# more one.sh 
#!/bin/bash
echo "this is a error message!" >&2
echo "this is a normal message!"
[root@node1 ljy]# sh one.sh 
this is a error message!
this is a normal message!
[root@node1 ljy]# sh one.sh 2> err.log
this is a normal message!
[root@node1 ljy]# more err.log 
this is a error message!

預設情況下,Linux會將STDERR導向STDOUT,但是執行指令碼時重定向了STDERR,指令碼中所有導向STDERR的都會被重新導向。

2、永久重定向

如果指令碼中有大量資料需要重定向,可以使用exec命令告訴shell在指令碼執行期間重定向某個特定檔案描述符。

[root@node1 ljy]# more one.sh 
#!/bin/bash
exec 1> normal.txt
exec 2> err.txt
echo "this is a error message!" >&2
echo "this is a normal message!"
[root@node1 ljy]# 
[root@node1 ljy]# sh one.sh 
[root@node1 ljy]# ls
err.txt  normal.txt  one.sh
[root@node1 ljy]# more err.txt 
this is a error message!
[root@node1 ljy]# more normal.txt 
this is a normal message!

指令碼中重定向輸入

exec命令允許你將STDIN重定向到linux檔案中

[root@node1 ljy]# more test   
one 
two
three
[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
exec 0< test
count=1
while read line
do  
  echo "$count:$line"
  count=$[$count + 1]
done
[root@node1 ljy]# sh ceshi.sh 
1:one
2:two
3:three

阻止命令輸出

shell輸出到null檔案的任何命令都不會被儲存!

在Linux系統中null的標準位置是/dev/null,你重定向到該位置的檔案都會被丟掉不會顯示。

[root@node1 ljy]# ls -al > /dev/null 
[root@node1 ljy]# more /dev/null 

也可以將/dev/null作為輸入檔案,可以用它來快速清空現有檔案的資料,而不需要刪除後重新建立。

[root@node1 ljy]# more test 
one 
two
three
[root@node1 ljy]# cat /dev/null > test 
[root@node1 ljy]# more test

建立臨時檔案

系統上的任何賬戶都有許可權讀寫/tmp目錄中的檔案

mktemp可以在本地目錄中建立一個臨時檔案,需要制定一個檔名,末尾需要設定6個X

[ljy@node1 tmp]$ mktemp ceshi.XXXXXX
ceshi.vyBZEx

-t選項會強制mktemp命令在系統的臨時目錄建立檔案。

由於mktemp命令返回來了全路徑名,你可以在Linux系統的任何目錄下引用該臨時檔案,不需要管目錄在哪。

[ljy@node1 /]$ mktemp -t ceshi.XXXXXX
/tmp/ceshi.eSU3MD

-d選項告訴mktemp命令來建立一個臨時目錄而不是一個檔案。

[ljy@node1 tmp]$ mktemp -d ceshi.XXXXXX
ceshi.9JVceD

記錄訊息

tee命令相當於管道的一個T型接頭。他將從STDIN過來的資料同時發往兩處,一處是STDOUT,另一處是tee命令列所指定的檔名。

[root@node1 ljy]# date | tee ceshi
2019年 05月 16日 星期四 13:57:40 CST
[root@node1 ljy]# more ceshi
2019年 05月 16日 星期四 13:57:40 CST

tee命令會在每次使用時覆蓋輸出內容,如果你想要追加,必須使用-a引數。

相關文章