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

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

標準輸入和輸出

我們先來了解下輸入和輸出的概念:

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

 

 

 

輸出重定向

對于程序來說:

程序 :指令 + 數據

對于數據來說,數據可以由我們通過鍵盤輸入,或者程序直接使用存儲設備上的數據,我們稱為讀入 數據,程序處理數據后需要返回一個結果,這個結果需要輸出出來,我們稱為輸出數據。

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 |

?將命令1STDOUT發送給命令2STDIN,命令2STDOUT發送到命令3STDIN

?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

(0)
linux_rootlinux_root
上一篇 2016-08-04
下一篇 2016-08-04

相關推薦

  • http協議及httpd特性詳解

    前言 隨著互聯網的迅猛發展和網絡的普及,各類網站層出不窮,網站也成為企業宣傳和實力展現的主要途徑之一,說到網站就不得不說一下web服務了,現在比較流行的web服務還是當屬Apache即httpd。本文將詳解http協議及httpd的特性。 http協議詳解 http協議 http: Hyper Text Transfer Protocol 超文本傳輸協議 傳…

    Linux干貨 2015-04-13
  • LVM(邏輯卷)(logical volume manager),快照卷

    邏輯卷的創建,擴展,縮減,遷移,刪除??煺站淼膭摻?/p>

    Linux干貨 2017-12-11
  • N25-第六周總結 vim編輯器

    vim編輯器:         模式化的編輯器             基本模式:                     編輯模式,命令模式,輸入模式,末行?!?/p>

    Linux干貨 2017-02-15
  • ACL實現靈活的權限管理

    ACL實現靈活的權限管理 除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限 CentOS7當中,無論是操作系統安裝時還是之后手工創建的文件系統(xfs、ext4)均會開啟ACL功能。 CentOS6及之前的版本,僅操作系統安裝時創建的文件系統才會默認開啟ACL,手工創建的文件系統,需要手工開啟ACL功能。 mount -o acl /dev/sda…

    2017-07-27
  • PXE網絡引導自動化安裝系統詳解

    一、PXE:預引導加載環境  1.PXE          Preboot ExecuteEnvironment:支持工作站通過網絡從遠端服務器下載映像,并由此支持通過網絡啟動操作系統,在啟動過程中,終端要求服務器分配IP地址,再用TFTP(trivial f…

    2016-04-30
  • linux中軟鏈接和硬鏈接簡單說明

    linux鏈接文件 在 Linux 上文件系統被分成兩個部分:數據 (user data) 與元數據 (metadata)。數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如:文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其并不包含…

    Linux干貨 2016-12-05
欧美性久久久久