輸出重定向 輸入重定向 管道簡單介紹
標準輸入和輸出
我們先來了解下輸入和輸出的概念:
在計算機中我們了解到計算機的組成部分:其中有輸入 輸出設備。
輸出重定向
對于程序來說:
程序 :指令 + 數據
對于數據來說,數據可以由我們通過鍵盤輸入,或者程序直接使用存儲設備上的數據,我們稱為讀入 數據,程序處理數據后需要返回一個結果,這個結果需要輸出出來,我們稱為輸出數據。
在linux系統中,打開的文件都有一個fd:file descriptor (文件描述符)
例如:我們使用 nano打開一個文件
#通過ps aux 可以看到我們使用的程序 nano
root 21498 0.2 0.3 116404 3052 pts/0 S+ 14:10 0:00 nano test
#查看fd的標示狀態
[root@wCentos7 ~]# ll /proc/21498/fd
total 0
lrwx——. 1 root root 64 Jul 30 14:11 0 -> /dev/pts/0
lrwx——. 1 root root 64 Jul 30 14:11 1 -> /dev/pts/0
lrwx——. 1 root root 64 Jul 30 14:10 2 -> /dev/pts/0
[root@wCentos7 ~]#
Linux給程序提供三種I/O設備
標準輸入(STDIN) ——-> 0 默認接受來自于鍵盤的輸入
標準輸出(STDOUT)—–> 1 默認輸出到終端窗口
標準錯誤(STDERR) —–> 2 默認輸出到終端窗口
我們是可以通過修改 I/O輸出和輸入可以 修改默認位置的,意思就是:
我們可以修改程序輸入的數據可以不來至鍵盤;
程序的正確輸出可以不輸出到屏幕上;
程序的錯誤輸出可以不輸出到屏幕上。
把輸出(正確的)和錯誤輸出重定向到文件
語法如下: 命令 操作符號 文件名
支持的炒作符號:
> : 把STDOUT重定向到文件;
2> : 把STDERR重定向到文件;
&> : 把以上兩類輸出重定向到文件
注意: > :文件內容會被覆蓋,不過我們也可以設置不覆蓋
Set -C : 禁止將內容覆蓋已有文件,但可以追加
Set +C : 允許覆蓋
>| : 強制覆蓋
>> : 在原來的基礎上,追加新內容,不覆蓋原來的內容
舉例說明:
標準輸出和錯誤輸出各自重定向到不同位置:
[root@wCentos7 ~]# ls -l / #默認輸出至屏幕上的消息 total 36 lrwxrwxrwx. 1 root root 7 Jul 21 11:23 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Jul 21 11:35 boot drwxr-xr-x. 19 root root 3240 Jul 28 08:36 dev drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc drwxr-xr-x. 8 root root 87 Jul 30 10:44 home lrwxrwxrwx. 1 root root 7 Jul 21 11:23 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Jul 21 11:23 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Aug 12 2015 media drwxr-xr-x. 2 root root 6 Aug 12 2015 mnt drwxr-xr-x. 3 root root 15 Jul 21 11:31 opt dr-xr-xr-x. 447 root root 0 Jul 28 08:36 proc dr-xr-x---. 14 root root 4096 Jul 30 10:25 root drwxr-xr-x. 38 root root 1120 Jul 29 20:14 run lrwxrwxrwx. 1 root root 8 Jul 21 11:23 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Aug 12 2015 srv dr-xr-xr-x. 13 root root 0 Jul 28 08:36 sys drwxr-xr-x. 18 root root 4096 Jul 30 11:21 testdir drwxrwxrwt. 23 root root 4096 Jul 30 14:28 tmp drwxr-xr-x. 13 root root 4096 Jul 21 11:23 usr drwxr-xr-x. 20 root root 4096 Jul 28 12:28 var
[root@wCentos7 ~]# ls -l / >/tmp/dui.log 2>/tmp/cuowu.log 正確的重定向到 dui.log文件 錯誤的重定向到 cuowu.log文件 屏幕上不再顯示任何的信息了 [root@wCentos7 ~]# cat /tmp/dui.log #查看文件的內容和正確輸出信息是一樣的 total 36 lrwxrwxrwx. 1 root root 7 Jul 21 11:23 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Jul 21 11:35 boot drwxr-xr-x. 19 root root 3240 Jul 28 08:36 dev drwxr-xr-x. 129 root root 8192 Jul 30 12:53 etc drwxr-xr-x. 8 root root 87 Jul 30 10:44 home lrwxrwxrwx. 1 root root 7 Jul 21 11:23 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Jul 21 11:23 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Aug 12 2015 media drwxr-xr-x. 2 root root 6 Aug 12 2015 mnt drwxr-xr-x. 3 root root 15 Jul 21 11:31 opt dr-xr-xr-x. 448 root root 0 Jul 28 08:36 proc dr-xr-x---. 14 root root 4096 Jul 30 10:25 root drwxr-xr-x. 38 root root 1120 Jul 29 20:14 run lrwxrwxrwx. 1 root root 8 Jul 21 11:23 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Aug 12 2015 srv dr-xr-xr-x. 13 root root 0 Jul 28 08:36 sys drwxr-xr-x. 18 root root 4096 Jul 30 11:21 testdir drwxrwxrwt. 23 root root 4096 Jul 30 14:31 tmp drwxr-xr-x. 13 root root 4096 Jul 21 11:23 usr drwxr-xr-x. 20 root root 4096 Jul 28 12:28 var
[root@wCentos7 ~]# lss -l / #錯誤默認輸出到屏幕上面來的 bash: lss: command not found... Similar command is: 'ls' [root@wCentos7 ~]# lss -l / >/tmp/dui.log 2>/tmp/cuowu.log [root@wCentos7 ~]# cat /tmp/cuowu.log #重定向后,信息保存在文件中了 bash: lss: command not found... Similar command is: 'ls'
對個命令的輸出重定向語法:
[root@wCentos7 ~]# (cat /etc/issue; cal) > /tmp/all.txt (記得多個命令使用括號 分號隔開) 把issue的內容 和 日歷的信息重定向到文件中 [root@wCentos7 ~]# cat /tmp/all.txt \S Kernel \r on an \m ======================== welcome to my hostname SA welcome to my hostname SB ========================= July 2016 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
對有些命令不管輸出的是正確的還是錯誤的輸出我們都丟棄掉不保存任何文件也不需要輸出默認輸出方法:
[root@wCentos7 ~]# findsss /etc/ -name passwdbash: findsss: command not found...
#默認錯誤輸出輸出至屏幕上
[root@wCentos7 ~]# find /etc/ -name passwd /etc/passwd /etc/pam.d/passwd
#默認正確輸出輸出至屏幕上
[root@wCentos7 ~]# find /etc/ -name passwd &>/dev/null [root@wCentos7 ~]# findsss /etc/ -name passwd &>/dev/null
#輸出重定向后,不管是錯誤的還是正確的數據在屏幕上都不輸出了
注意:/dev/null是一個特殊的設備,就是一個數據黑洞,吞噬送往該設備的所有數據,以后如果不想讓屏幕有顯示可以,會經常用到這個/dev/unll 的數據吞噬設備
輸入重定向
關于輸入重定向,默認情況下,有許多的指令時等待默認輸入設備輸入的,比如默認輸入設備鍵盤。等待鍵盤輸入指令有: cat tr等等命令,我們就以實際的案例來了解輸入重定向如何使用 。
正常情況下你使用cat命令不帶任何參數,cat就會另起一行,你輸入什么,他就輸出什么,和用戶就有一個交換的過程,我們如果把需要輸入的數據保存在文件中,一起輸入到cat中去行不行,是可以的,我們可以這樣操作:
輸入重定向的表示符為: <
Cat命令輸入重定向:
[root@wCentos7 ~]# cat < /etc/fstab #我們使用 < 就把fatab文件中的內容輸入至cat命名,cat命令在顯示在標準輸出上。 # # /etc/fstab # Created by anaconda on Thu Jul 21 11:22:48 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=b63a2f0c-c9f9-465d-b2b5-3830fedccdd2 / xfs defaults 0 0 UUID=9dec22f7-215e-4a47-97d1-ae09446d62d2 /boot xfs defaults 0 0 UUID=a138a967-21db-41e0-9a4a-7a5eb4979481 /testdir xfs defaults 0 0 UUID=bb99272d-4848-49bd-a896-e5f843037cbf swap swap defaults 0 0
tr 命令輸入重定向
[root@wCentos7 yuedir]# tr "a-z" "A-Z" < /etc/issue #把輸入進入的數據小寫字母轉化為大寫字母 \S KERNEL \R ON AN \M ======================== WELCOME TO MY HOSTNAME SA WELCOME TO MY HOSTNAME SB =========================
管道
管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
?將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
?STDERR默認不能通過管道轉發,可利用2>&1 或|& 實現
?最后一個命令會在當前shell進程的子shell進程中執行用來
?組合多種工具的功能
舉例說明:
[root@wCentos7 yuedir]# cat /etc/issue | tr "a-z" "A-Z" #小寫轉換為大寫 \S KERNEL \R ON AN \M ======================== WELCOME TO MY HOSTNAME SA WELCOME TO MY HOSTNAME SB =========================
[root@wCentos7 yuedir]# echo 1234567890 | passwd --stdin harry #自動修改密碼 Changing password for user harry. passwd: all authentication tokens updated successfully. [root@wCentos7 yuedir]#
總結:
輸入重定向與管道感覺功能上有些沖突,管道的功能更好跟強大,支持的命令比輸入重定向多。
關于管道的更做的功能在實際運用中慢慢體會,比如: tr 命令 ,tee命令等等,后面介紹命令的使用可以更好的理解管道的使用。
原創文章,作者:linux_root,如若轉載,請注明出處:http://www.www58058.com/27694