1、文件描述符定義
文件描述符:是內核為了高效管理已被而打開的文件所創建的縮影,用於指向被打開的文件,所有執行I/O操作的系統調用都通過文件描述符:文件描述符是一個簡單的非負整數,用於標明每一個被進程所打開的文件,程序剛剛啟動的時候,第一個打開的文件是0,第二個是1,以此類推。可以理解為是一個文件的身份ID。
用戶通過操作系統處理信息的過程中,使用的交互設備文件(鍵盤,鼠標,顯示器)也是一個文件
Number | Channel | Description | Default connection | Usage | 描述 |
---|---|---|---|---|---|
0 | stdin | standard input | keyboard | read only | 默認設備:鍵盤,文件編號0 |
1 | stdout | standard output | Terminal | write only | 默認設備:顯示器,文件編號1,可重新定向到文件 |
2 | stuerr | standard error | Terminal | write only | 默認設備:顯示器,文件編號2,可重新定向到文件 |
3+ | filename | other files | none | read and/or write |
舉例:
1)查看一個進程打開了那些文件
ll /proc/進程ID/fd
如下所示:
vim /etc/passwd
新開終端
[root@linuxprobe ~]# ps -aux|grep passwd
root 6705 0.1 0.1 151664 5364 pts/2S+ 10:54 0:00 vim /etc/passwd
root 6707 0.0 0.0 112720 968 pts/0R+ 10:54 0:00 grep --color=auto passwd
新開終端
[root@linuxprobe ~]# ll /proc/6705/fd
總用量 0
lrwx------. 1 root root 64 4月 30 10:54 0 -> /dev/pts/2
lrwx------. 1 root root 64 4月 30 10:54 1 -> /dev/pts/2
lrwx------. 1 root root 64 4月 30 10:54 2 -> /dev/pts/2
lrwx------. 1 root root 64 4月 30 10:54 4 -> /etc/.passwd.swp
- 注釋:這些 0、1、2就是文件的描述符。一個進程啟動時,都會打開3個文件:標准輸入、標准輸出和標准出錯處理。這3個文件分別對應文件描述符為0、1和2也就是宏替換STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。/proc/進程ID/fs /#這個fd目錄下,專門存放文件描述符。對文件描述符的操作就是對文件本身的操作。可以通過修改文件描述符來修改文件。
2)查看和臨時設置一個進程最多可以打開幾個文件
即:一個進程可以打開的文件描述符的限制:
-
查看文件限制:
[root@linuxprobe ~]# ulimit -n
1024 -
臨時修改文件限制:
[root@linuxprobe ~]# ulimit -n 2048
[root@linuxprobe ~]# ulimit -n
2048
2.重定向的含義
2.1 輸出重定向
定義:將命令的正常輸出結果保存到指定的文件中,而不是直接顯示在顯示器上
重定向輸出使用“>”,">>" 操作符號
語法:“> 文件名” #表示將標准輸出的內容,寫到后面的文件中,如果此文件名已經存在,將會覆蓋原文件中的內容。
“>> 文件名” #表示將標准輸出的內容,追加到后面的文件中。若重定向的輸出文件不存在,則會新建文件。
例1:查看當前主機的CPU類型保存到cpu.txt文件中(而不是直接顯示到屏幕上):
cat /proc/cpuinfo > cpu.txt
例2:將當前內核的信息追加到cpu.txt文件中
uname -a >> cpu.txt
例3:清空一個文件:
>cpu.txt
2.2 輸入重定向
“ < 文件名”, 輸入重定向,將命令的輸入由標准輸入改為文件名。
例1:將命令中接受輸出的途徑由默認的鍵盤改為其他文件,而不是等待從鍵盤輸入
grep root < /etc/passwd
[root@linuxprobe ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
例2:mysql中數據導入
mysql -u root - p 123456 < 123.sql 將123.sql導入mysql數據庫中
2.3 EOF
EOF本意是指End Of File,表明到了文件末尾。“EOF”通常與“<<”結合使用,“<<EOF”表示后續的輸入作為子命令或者子shell的輸入,直到遇到“EOF”,然后再次返回到主調shell,可以理解為分界符(delimiter)。既然是分解符,那么形式自然不是固定的,這里可以將"EOF"進行自定義,但是前后的“EOF”必須成對出現且不能和shell命令沖突。
舉例:
1)在a.txt中持續輸入字符,使用eof作為分解符
[root@linuxprobe ~]# cat > b.txt << efo
> asfdasfl
> asdfasdg
> 1231245
> 4566733
> 988081
> efo
[root@linuxprobe ~]# cat b.txt
asfdasfl
asdfasdg
1231245
4566733
988081
2)在a.txt中持續輸入字符,使用自定義如ccc(不與shell命令沖突)作為分解符
[root@linuxprobe ~]# cat > c.txt <<ccc
> 1235
> 7erdrdsf
> erqtqtzxdg
> asfqwerqet
> afddfaf
> eof
> eof
> ccc
[root@linuxprobe ~]# cat c.txt
1235
7erdrdsf
erqtqtzxdg
asfqwerqet
afddfaf
eof
eof
3)在腳本中可以通過輸入重定向來打印消息菜單
[root@linuxprobe ~]# vim p.sh
#!/bin/bash
cat << efo
=======================
1.mysql
2.oracle
3.httpd
=======================
efo
[root@linuxprobe ~]# chmod +x p.sh
[root@linuxprobe ~]# ./p.sh
=======================
1.mysql
2.oracle
3.httpd
=======================
2.4 錯誤重定向
將命令執行過程中出現的錯誤消息(消息或者參數錯誤)保存到指定的文件,而不是直接顯示到顯示器
作用:將錯誤信息保存到文件
操作符:標准錯誤重定向符號: “2>”;標准舒服:1<或者簡寫<;標准輸出:0>或者>;
在實際應用中,錯誤重定向可以用來收集執行的錯誤信息,為排錯提供依據;對於shell腳本還可以將無關緊要的錯誤信息重定向到空文件/dev/null中,用於保持腳本輸出的簡潔
舉例
1)將錯誤顯示的內容和正確顯示的類容分開,將錯誤信息舒服到error.txt
[root@linuxprobe ~]# ll /etc/passwd helloworld
ls: 無法訪問helloworld: 沒有那個文件或目錄
-rw-r--r--. 1 root root 3379 4月 30 10:58 /etc/passwd
[root@linuxprobe ~]# ll /etc/passwd helloworld 2>error.txt
-rw-r--r--. 1 root root 3379 4月 30 10:58 /etc/passwd
[root@linuxprobe ~]# cat error.txt
ls: 無法訪問helloworld: 沒有那個文件或目錄
2.5 null黑洞和zero空文件
1). 把/dev/null看作“黑洞”,所有寫入它的內容都會永遠丟失,而嘗試從它哪兒讀取內容則什么都讀不到。然而/dev/null對命令行和腳本都非常有用
2). /dev/zero在類unix操作系統中,/dev/zero是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它來產生一個特定大小的空白文件。
例:使用dd命令產生一個50M的文件
參數 | 說明 |
---|---|
if | 代表輸入文件。如果不指定if,默認就會從stdin中讀取輸入 |
of | 代表輸出文件。如果不指定of,默認就將會stdout作為默認輸出 |
bs | 代表字節為單位的塊大小 |
count | 代表被復制的塊數 |
[root@linuxprobe ~]# dd if=/dev/zero of=b.txt bs=1M count=50
記錄了50+0 的讀入
記錄了50+0 的寫出
52428800字節(52 MB)已復制,0.058321 秒,899 MB/秒
2.6 &>和>&符號
&表示等同於的意思
舉例:
1)把正確和錯誤的消息輸入到相同的位置
1>&2 把標准輸出重新定向到標准錯誤;
2>&1 把標准錯誤重新定向到標准輸出;
等同於把正確和錯誤的信息放到同一個文件
[root@linuxprobe ~]# ll /tmp xxx >1.txt 2>&1
[root@linuxprobe ~]# ll /tmp xxx 2>2.txt 1>&2
2)工作中shell腳本中的>/dev/null 2>&1是什么意思?
[root@linuxprobe ~]# cat /etc/passwd >/dev/null 2>&1
注:將標准輸出和標准錯誤輸出都重新定向到/dev/null,既將產生的所有信息丟棄;
11.3 管道|的使用
語法:
command -a|command -b|command -c|......
注意:
-
管道命令只處理前一個命令的正確輸出,不處理錯誤輸出;
-
管道右邊的命令,必須能夠接受標准輸入的數據流命令才行;
-
管道符可以把兩條命令連起來,它可以連接多個命令使用
11.4 tee命令
功能:讀取標准輸入的數據,並將內容輸出成文件。
語法:tee 【-a】【--help】【--version】【文件...】
參數:-a, --append 內容追加到給定的文件而非覆蓋
tee指令會從標准輸入設備讀取數據,將其內容輸出到標准輸出設備,同時保存成文件;
舉例:
查詢磁盤信息,同時將磁盤信息寫入到file.txt
df -h|tee -a file.txt
---end
---2019-5-3 17:07:19