[shell基礎]——I/O重定向

Jelly_lyj發表於2017-03-18

檔案識別符號(FD)

1. Linux使用檔案識別符號(FD)來標識一個程式正在訪問的特定檔案

2. 當開啟一個檔案或建立一個檔案時,Linux將返回一個檔案識別符號供其他操作引用

3. 檔案識別符號是一個小的非負整數,他是對應程式的

4. 當Linux系統啟動一個程式時,將自動為該程式開啟三個檔案:標準輸入(stdin)、標準輸出(stdout)、標準錯誤輸出(stderr)

5. 該程式如果要開啟其他的輸入或輸出檔案,則從整數3開始標識

我們知道,/proc/N/fd目錄包含了程式pid為N的、相關的所有的檔案描述符
我們可以看看這個目錄下有什麼
# ll /proc/1/fd/
總用量 0
lrwx------ 1 root root 64 7月  25 11:22 0 -> /dev/null
lrwx------ 1 root root 64 7月  25 11:22 1 -> /dev/null
lrwx------ 1 root root 64 7月  25 11:22 2 -> /dev/null
lr-x------ 1 root root 64 7月  25 11:22 3 -> pipe:[7399]
l-wx------ 1 root root 64 7月  25 11:22 4 -> pipe:[7399]
lr-x------ 1 root root 64 7月  25 11:22 5 -> inotify
lr-x------ 1 root root 64 7月  25 11:22 6 -> inotify
lrwx------ 1 root root 64 7月  25 11:22 7 -> socket:[7400]
lrwx------ 1 root root 64 7月  25 11:22 9 -> socket:[11307]

 


stdin、stdout、stderr

1. 標準輸入(stdin)、標準輸出(stdout)、標準錯誤輸出(stderr)三者的關係是?

    shell命令從"標準輸入"讀取輸入資料,將輸出送到"標準輸出",如果命令在執行過程中發生錯誤則將錯誤資訊輸出到”標準錯誤輸出“

 

 

   

2. stdin、stdout、stderr是怎麼來的?

# ll /dev/stdin 
lrwxrwxrwx 1 root root 15 7月  25 2016 /dev/stdin -> /proc/self/fd/0
# ll /dev/stdout 
lrwxrwxrwx 1 root root 15 7月  25 2016 /dev/stdout -> /proc/self/fd/1
# ll /dev/stderr 
lrwxrwxrwx 1 root root 15 7月  25 2016 /dev/stderr -> /proc/self/fd/2

 


輸入輸出重定向的符號及其用法

1. 輸出重定向:>   >>  >|

    在指令碼中用的最多的就是把一條命令的執行結果輸出重定向到一個文字檔案中去

# cat > newfile   --->#把輸入重定向到newfile這個文字檔案中去
hello
this is a test    --->#按ctrl+d結束
# cat newfile 
hello
this is a test

注意理解>和>>的區別
# echo "追加內容" >>newfile
# cat newfile 
hello
this is a test
追加內容
# echo "覆蓋內容" >newfile
# cat newfile 
覆蓋內容

>|與shell的noclobber選項有關係,表示強制覆蓋檔案
# set -o noclobber   --->#開啟此選項
# echo "試圖覆蓋" >newfile  --->#試圖覆蓋newfile時報錯
bash: newfile: cannot overwrite existing file
# echo "強制覆蓋" >|newfile --->#可以使用>|強制覆蓋
# cat newfile 
強制覆蓋

 

2. 重定向標準輸出和標準錯誤的方法

# ll 1.txt 2.txt 
ls: 無法訪問2.txt: 沒有那個檔案或目錄              --->#這是一條標準錯誤輸出
-rw-r--r-- 1 root root 0 7月  25 14:52 1.txt   --->#這是一條標準輸出

把錯誤輸出重定向,不顯示在螢幕上
# ll 1.txt 2.txt 2>/dev/null
-rw-r--r-- 1 root root 0 7月  25 14:52 1.txt

把標準輸出重定向,不顯示在螢幕上
# ll 1.txt 2.txt 1>/dev/null
ls: 無法訪問2.txt: 沒有那個檔案或目錄

把標準輸出和錯誤輸出分別重定向到不同的檔案中
# ll 1.txt 2.txt 1>outfile 2>errfile
# cat outfile 
-rw-r--r-- 1 root root 0 7月  25 14:52 1.txt
# cat errfile 
ls: 無法訪問2.txt: 沒有那個檔案或目錄

指令碼中最常用的:就是把所有輸出都不顯示在螢幕上
# ll 1.txt 2.txt &>/dev/null
# ll 1.txt 2.txt >/dev/null 2>&1

 

3. 在指令碼中,while/for/until/if語句的重定向可以按行讀取文字檔案中的內容,以此實現某種處理

===while迴圈===
while read line 
do
    echo $line
done < newfile  --->#將newfile文字中的內容按行讀取

===for迴圈===
ls /etc >loggg
maxline=`wc -l <loggg`
for filename in `seq $maxline`
do
   read filename
   echo $filename
done <logg

 

4. 標準輸入到標準輸出的傳遞: |(管道)、exec、xargs

(1) -exec 執行後面的命令(其中, “{}”表示存放find命令查詢的結果,  “\;”表示結束標誌
(2) xargs 是將前面命令的輸出做為引數送給後面的命令使用
      -n 後面跟數字num,限制xargs後面的命令接收引數時按num個接收

# find /boot -name "vmlinuz*" | xargs ls -l
-rwxr-xr-x. 1 root root 4044560 Jan 30 2013 /boot/vmlinuz-2.6.32-358.el6.x86_64

# find /boot -name "vmlinuz*" -exec ls -l {} \;
-rwxr-xr-x. 1 root root 4044560 Jan 30 2013 /boot/vmlinuz-2.6.32-358.el6.x86_64

 

相關文章