自學Linux Shell14.2-在腳本中使用其餘文件描述符

點擊返回 自學Linux命令行與Shell腳本之路html

14.2-在腳本中使用其餘文件描述符

在腳本中重定向輸入和輸出,並佈局限於以上講的3個默認的文件描述符,shell最多能夠有9個打開的文件描述符。這節介紹在腳本中使用其餘文件描述符。linux

1.文件描述符的操做

Shell 中對文件描述符的操做由三部分組成: (Left, Operation, Right):shell

  • Left 能夠是 0-9 的數字, 表明第 n 號文件描述符;
         Left 還能夠爲 &, 表示同時操做 stdout 和 stderr
  • Right 能夠是文件名或 0-9 的數字, 當 Right 是數字時必需要加上 & 符號, 表示引用第 n 號文件描述符;
         Right 還能夠爲 &-, 此時表示關閉 Left 描述符, 例如 2<&- 表示關閉 stderr;
  • Operation 能夠爲 < 或 >;
         爲 < 時表示以讀模式複製 Right 到 Left, 此時若是沒有指定 Left 的話, 則爲默認值 0;
         當爲 > 表示以寫模式複製 Right 到 Left, 此時若是沒有指定 Left 的話, 則爲默認值 1;
         Operation 和 Left 之間不能有空格;
         當 Right 爲文件名時, Operation 和 Right 能夠有空格, 不然也不能有空格;

 當存在多個文件描述符的操做時, 會按照從左往右的順序依次執行. 例如經過命令佈局

1  cmd 3>&1 1>&2 2>&3 3>&- 

就能夠交換 stdin 和 stdout.spa

2 I/O重定向的經常使用用法

  • command > filename      把標準輸出重定向到一個新文件中
  • command >> filename      把標準輸出重定向到一個文件中(追加)
  • command 1 > fielname      把標準輸出重定向到一個文件中
  • command > filename 2>&1    把標準輸出和標準錯誤一塊兒重定向到一個文件中
  • command 2 > filename     把標準錯誤重定向到一個文件中
  • command 2 >> filename     把標準輸出重定向到一個文件中(追加)
  • command >> filename 2>&1   把標準輸出和標準錯誤一塊兒重定向到一個文件中(追加)
  • command < filename >filename2   把command命令以filename文件做爲標準輸入,以filename2文件做爲標準輸出
  • command < filename    把command命令以filename文件做爲標準輸入
  • command << delimiter   把從標準輸入中讀入,直至遇到delimiter分界符
  • command <&m    把文件描述符m做爲標準輸入
  • command >&m    把標準輸出重定向到文件描述符m中
  • command <&-    把關閉標準輸入 
  • command %n%c file    command 輸出重定向的命令 ,%n 文件描述符,默認值爲1,%c 重定向符 ,file 目標文件。

 3. exec命令的介紹

 exec命令用於調用並執行指令的命令。exec命令一般用在shell腳本程序中,能夠調用其餘的命令。若是在當前終端中使用命令,則當指定的命令執行完畢後會當即退出終端命令行

 exec用法:code

  • &n :表明描述符表明的文件
  • > < :表明以什麼形式使用描述符
  • exec 8<&2 :描述符8以讀取方式打開標準錯誤對應的文件
  • exec &>log:把標準輸入錯誤打開文件log
  • exec 8<&- :關閉描述符8

 4. 列出打開的文件描述符lsof

lsof會列出整個linux系統打開的全部文件描述符,,命令爲隱藏狀態。
不少的linux系統中(如Fedora),lsof命令位於/usr/sbinhtm

 1 lsof
 2 command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
 3 init          1 root  cwd       DIR                8,2     4096          2 /
 4 init          1 root  rtd       DIR                8,2     4096          2 /
 5 init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
 6 init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
 7 init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
 8 init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
 9 init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
10 init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
11 init          1 root   10u     FIFO               0,17                1233 /dev/initctl
12 migration     2 root  cwd       DIR                8,2     4096          2 /
13 migration     2 root  rtd       DIR                8,2     4096          2 /
14 migration     2 root  txt   unknown                                        /proc/2/exe
15 ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
16 ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
17 ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
18 migration     4 root  cwd       DIR                8,2     4096          2 /
19 migration     4 root  rtd       DIR                8,2     4096          2 /
20 migration     4 root  txt   unknown                                        /proc/4/exe
21 ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
22 ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
23 ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
24 events/0      6 root  cwd       DIR                8,2     4096          2 /
25 events/0      6 root  rtd       DIR                8,2     4096          2 /
26 events/0      6 root  txt   unknown                                        /proc/6/exe
27 events/1      7 root  cwd       DIR                8,2     4096          2 /

lsof輸出各列信息的意義以下:blog

  • COMMAND:進程的名稱
  • PID:進程標識符
  • USER:進程全部者
  • FD:文件描述符,應用程序經過文件描述符識別該文件
  • TYPE:文件的類型,DIR表示字符型,BLK表示塊型,DIR表示目錄,REG表示常規文件
  • DEVICE:設備的設備號
  • SIZE:若是有的話,表示文件的大小
  • NODE:本地文件的節點號
  • NAME:文件名

通常在標準輸出、標準錯誤、標準輸入後還跟着文件狀態模式:進程

  • u:表示該文件被打開並處於讀取/寫入模式。
  • r:表示該文件被打開並處於只讀模式。
  • w:表示該文件被打開並處於。
  • 空格:表示該文件的狀態模式爲unknow,且沒有鎖定。
  • -:表示該文件的狀態模式爲unknow,且被鎖定。

同時在文件狀態模式後面,還跟着相關的鎖:

  • N:for a Solaris NFS lock of unknown type;
  • r:for read lock on part of the file;
  • R:for a read lock on the entire file;
  • w:for a write lock on part of the file;(文件的部分寫鎖)
  • W:for a write lock on the entire file;(整個文件的寫鎖)
  • u:for a read and write lock of any length;
  • U:for a lock of unknown type;
  • x:for an SCO OpenServer Xenix lock on part      of the file;
  • X:for an SCO OpenServer Xenix lock on the      entire file;
  • space:if there is no lock.

5. 記錄消息tee

tee用於將數據重定向到文件,另外一方面還能夠提供一份重定向數據的副本做爲後續命令的stdin。簡單的說就是把數據重定向到給定文件和屏幕上。

  • 默認狀況下,tee命令在每次使用時候覆蓋輸出文件內容
  • -a , 將數據追加到文件中
  • -i ,忽略終端信號
相關文章
相關標籤/搜索