學習筆記:CentOS 7學習之十一:文件的重定向



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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM