歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 輸出重定向 輸入重定向 管道簡單介紹

輸出重定向 輸入重定向 管道簡單介紹

日期:2017/3/3 11:03:40   编辑:Linux技術

輸出重定向 輸入重定向 管道簡單介紹

標准輸入和輸出

我們先來了解下輸入和輸出的概念:在計算機中我們了解到計算機的組成部分:其中有輸入 輸出設備。

輸出重定向

對於程序來說:

程序 :指令 + 數據 對於數據來說,數據可以由我們通過鍵盤輸入,或者程序直接使用存儲設備上的數據,我們稱為讀入 數據,程序處理數據後需要返回一個結果,這個結果需要輸出出來,我們稱為輸出數據。在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/fdtotal 0lrwx------. 1 root root 64 Jul 30 14:11 0 -> /dev/pts/0lrwx------. 1 root root 64 Jul 30 14:11 1 -> /dev/pts/0lrwx------. 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/bindr-xr-xr-x. 4 root root 4096 Jul 21 11:35 bootdrwxr-xr-x. 19 root root 3240 Jul 28 08:36 devdrwxr-xr-x. 129 root root 8192 Jul 30 12:53 etcdrwxr-xr-x. 8 root root 87 Jul 30 10:44 homelrwxrwxrwx. 1 root root 7 Jul 21 11:23 lib -> usr/liblrwxrwxrwx. 1 root root 9 Jul 21 11:23 lib64 -> usr/lib64drwxr-xr-x. 2 root root 6 Aug 12 2015 mediadrwxr-xr-x. 2 root root 6 Aug 12 2015 mntdrwxr-xr-x. 3 root root 15 Jul 21 11:31 optdr-xr-xr-x. 447 root root 0 Jul 28 08:36 procdr-xr-x---. 14 root root 4096 Jul 30 10:25 rootdrwxr-xr-x. 38 root root 1120 Jul 29 20:14 runlrwxrwxrwx. 1 root root 8 Jul 21 11:23 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Aug 12 2015 srvdr-xr-xr-x. 13 root root 0 Jul 28 08:36 sysdrwxr-xr-x. 18 root root 4096 Jul 30 11:21 testdirdrwxrwxrwt. 23 root root 4096 Jul 30 14:28 tmpdrwxr-xr-x. 13 root root 4096 Jul 21 11:23 usrdrwxr-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 36lrwxrwxrwx. 1 root root 7 Jul 21 11:23 bin -> usr/bindr-xr-xr-x. 4 root root 4096 Jul 21 11:35 bootdrwxr-xr-x. 19 root root 3240 Jul 28 08:36 devdrwxr-xr-x. 129 root root 8192 Jul 30 12:53 etcdrwxr-xr-x. 8 root root 87 Jul 30 10:44 homelrwxrwxrwx. 1 root root 7 Jul 21 11:23 lib -> usr/liblrwxrwxrwx. 1 root root 9 Jul 21 11:23 lib64 -> usr/lib64drwxr-xr-x. 2 root root 6 Aug 12 2015 mediadrwxr-xr-x. 2 root root 6 Aug 12 2015 mntdrwxr-xr-x. 3 root root 15 Jul 21 11:31 optdr-xr-xr-x. 448 root root 0 Jul 28 08:36 procdr-xr-x---. 14 root root 4096 Jul 30 10:25 rootdrwxr-xr-x. 38 root root 1120 Jul 29 20:14 runlrwxrwxrwx. 1 root root 8 Jul 21 11:23 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 Aug 12 2015 srvdr-xr-xr-x. 13 root root 0 Jul 28 08:36 sysdrwxr-xr-x. 18 root root 4096 Jul 30 11:21 testdirdrwxrwxrwt. 23 root root 4096 Jul 30 14:31 tmpdrwxr-xr-x. 13 root root 4096 Jul 21 11:23 usrdrwxr-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 \SKernel \r on an \m ========================welcome to my hostname SAwelcome to my hostname SB========================= July 2016 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29 3031

對有些命令不管輸出的是正確的還是錯誤的輸出我們都丟棄掉不保存任何文件也不需要輸出默認輸出方法:

[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 0UUID=9dec22f7-215e-4a47-97d1-ae09446d62d2 /boot xfs defaults 0 0UUID=a138a967-21db-41e0-9a4a-7a5eb4979481 /testdir xfs defaults 0 0UUID=bb99272d-4848-49bd-a896-e5f843037cbf swap swap defaults 0 0

tr 命令輸入重定向

[root@wCentos7 yuedir]# tr "a-z" "A-Z" < /etc/issue #把輸入進入的數據小寫字母轉化為大寫字母\SKERNEL \R ON AN \M========================WELCOME TO MY HOSTNAME SAWELCOME TO MY HOSTNAME SB=========================

管道

管道(使用符號“|”表示)用來連接命令命令1 | 命令2 | 命令3 | …將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDINSTDERR默認不能通過管道轉發,可利用2>&1 或|& 實現最後一個命令會在當前shell進程的子shell進程中執行用來組合多種工具的功能舉例說明:

[root@wCentos7 yuedir]# cat /etc/issue | tr "a-z" "A-Z" #小寫轉換為大寫\SKERNEL \R ON AN \M========================WELCOME TO MY HOSTNAME SAWELCOME 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命令等等,後面介紹命令的使用可以更好的理解管道的使用。

Copyright © Linux教程網 All Rights Reserved