zoukankan      html  css  js  c++  java
  • Linux-输出/输入重定向

    重定向的分类

    名称 文件描述符 作用
    标准输入(stdin) 0 默认由键盘输入(其他输入命令的终端设备或某个文件也可输入)
    标准输出(stdout) 1 默认输出到屏幕
    错误输出(stderr) 2 默认输出到屏幕
    文件名(filename) 3+

    进程描述符:一个进程或者终端在启动时,都会开启文件描述符。



    # 关于标准输出重定向,标准输入重定向,错误输出重定向设备文件位置(软链接文件)
    [root@wqh06 ~]# ll  /dev/st*
    lrwxrwxrwx. 1 root root 15 Nov 28 18:49 /dev/stderr -> /proc/self/fd/2	#错误输出  2> 2>>  不能省略
    lrwxrwxrwx. 1 root root 15 Nov 28 18:49 /dev/stdin -> /proc/self/fd/0	#标准输入  < << 0  可以省略
    lrwxrwxrwx. 1 root root 15 Nov 28 18:49 /dev/stdout -> /proc/self/fd/1	#标准输出  > >>	1  可以省略
    
    

    各类重定向文件描述符的用法:

    类型 符号 用途 备注
    标准覆盖输出重定向 1> 将命令执行的正确结果默认输出的位置,修改为指定的文件或者终端(覆盖原有内容) 通常'>'即可,1可以不写,默认就是1
    标准追加输出重定向 >> 将命令执行的正确结果,输出到指定文件的末尾(不覆盖原有内容)
    错误覆盖输出重定向 2> 将命令执行的错误结果默认输出的位置,修改为指定的文件或者终端(覆盖原有内容)
    错误追加输出重定向 2>> 将命令执行的错误结果,输出到指定文件的末尾(不覆盖原有内容)
    标准输入重定向 0< 将命令中接收输入内容由默认的键盘,改为命令或者文件 通常'<'即可0可以写也可以不写,默认0
    标准输入追加重定向 0<< 将命令中接收输入内容由默认的键盘,改为命令或者文件

    输出重定向

    将标准输出重定向到文件

    # 将标准输出重定向到终端
    [root@wqh06 pts]# echo "w shi da shui bi" > /dev/pts/1 
    
    # 标准覆盖输出重定向到文件
    [root@wqh06 ~]# echo wqh>/tmp/1.txt     # 字符串输出到文件中
    [root@wqh06 ~]# cat /tmp/1.txt
    wqh
    
    [root@wqh06 ~]# echo 321>/tmp/2.txt     # 会将`321`视作文件描述符,所以文件中不会有任何内容
    [root@wqh06 ~]# cat /tmp/2.txt
    
    [root@wqh06 ~]# echo wqh1>/tmp/3.txt    # 因为`1`前面有`wqh`字符串作为连接,所以不会将`1`视作文件描述符
    [root@wqh06 ~]# cat /tmp/3.txt
    wqh1
    

    将标准输出追加重定向到文件

    # 标准追加输出重定向
    [root@wqh06 ~]# echo 456 >> /var/log/messages
    [root@wqh06 ~]# echo 123 >> /var/log/messages
    

    将错误输出重定向到文件

    # 错误输出重定向,使用普通用户cdx登录,查询/etc/下所有目录,有些文件会报错权限不足
    [cdx@wqh06 ~]$ find /etc/ -type d 2> finderror.txt	            # 普通用户权限有时受限
    [cdx@wqh06 ~]$ find /etc/ -type d > findright.txt 2> finderror.txt  # 正确结果和错误结果分开保存
    

    将标准输出和错误输出都重定向到文件

    # 将标准输出和错误输出都输出到相同的文件中
    [cdx@wqh06 ~]$ find /etc/ -type d > /tmp/100.txt 2>&1 	# 错误输出需要由 1 输出到文件中
    [cdx@wqh06 ~]$ find /etc/ -type d &> /tmp/101.txt	# 错误输出和标准输出,同时输出到文件中,包括其他3,4,5,6...文件描述符的输出
    # 上面两种方法方式不同,效率不同,且第二种方法 `&>` 包含的文件描述符范围更广泛
    

    将错误输出重定向到黑洞文件

    # 将错误输出,重定向到黑洞,这是我们常卸载Shell脚本中的语句,明知会有错,但不想看到错误提示
    [root@wqh06 ~]# ls / /ooo 2> /dev/null
    
    # 脚本中使用重定向
    
    [root@wqh06 ~]# cat test.sh
    #!/bin/bash
    ping  -c1  www.baidu.com &>/dev/null
    
    if [ $? -eq 0 ];then
    	echo "网络是通畅的....."
    else
    	echo "网络是不通的....."
    fi
    [root@wqh06 ~]# ./test.sh 
    网络是通畅的.....
    

    输入重定向

    将默认从键盘上面输入的内容改为从命令中或者文件读取内容
    
    <		# 标准输入重定向, 作用:将默认从键盘上面读取内容改为从命令或者文件读取内容
    <<		# 标准输入限定标识符重定向,作用:标准输入内容,直到遇到标识符的分解符结束
    
    
    案例1:标准输入重定向
    
    [root@wqh06 ~]# cat < file1.txt    # 将file1.txt的内容输入给cat,由cat输出到终端,我们通常省略了 `<`
    hello
    test
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    [root@wqh06 ~]# cat             # 只写cat需要在终端输入内容,然后cat将输入的内容输出到终端
    root
    root
    ^C
    [root@wqh06 ~]# tr  'f'  'F'    # 和cat一样,只写tr命令需要在终端输入内容,tr命令替换后,输出到终端
    file
    File
    ^C
    [root@wqh06 ~]# tr  'f'  'F'   <file1.txt     # 将file1.txt的内容输入给tr,tr执行替换后再输出到终端,tr命令无法省略 `<`
    hello
    test
    File1.txt
    File2.txt
    File3.txt
    File4.txt
    [root@wqh06 ~]# tr  'f'  'F' < file1.txt > file2.txt    # 把tr替换后的内容输出到一个新文件file2.txt中
    
    [root@wqh06 ~]# grep  'root'  /etc/passwd        # 常用的grep语法,省略了`<`
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin 
    [root@wqh06 ~]# grep  'root' <  /etc/passwd      # 完整的grep语法,将/etc/passwd文件内容交给grep命令
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@wqh06 ~]# grep  'root'                     # 同样,如果没有标准输入重定向读取文件内容,就需要从键盘输入,交给grep,然后在终端输出
    wqh06 
    root
    root        # 由grep输出,匹配的有root的行
    roottt
    roottt      # 由grep输出,匹配的有root的行
    ^C
    
    案例2:数据库中导入库或者表,恢复数据 
    
    [root@wqh06 ~]# mysql  -uroot -p123  < database.sql    # 恢复数据
    
    案例3:生成一个文件
    
    	dd			# 生成一个大文件
    		if		# 从哪里读取数据
    		of		# 输出到哪里
    		bs		# 一次输出多少
    		count	        # 输出的次数
    	
    [root@wqh06 ~]# dd  if=/dev/zero  of=/root/test.log  bs=10M  count=100     # if/of的写法
    100+0 records in
    100+0 records out
    1048576000 bytes (1.0 GB) copied, 27.5536 s, 38.1 MB/s
    [root@wqh06 ~]# ll -h
    total 1001M
    -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
    
    [root@wqh06 ~]# dd  </dev/zero  >/root/test.txt  bs=10M count=10    # 重定向的写法,与上面效果相同
    10+0 records in
    10+0 records out
    104857600 bytes (105 MB) copied, 11.6617 s, 9.0 MB/s
    [root@wqh06 ~]# ll -h
    total 1.1G
    -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
    -rw-r--r--. 1 root root  100M Dec 19 18:28 test.txt
    
    案例4:标准输入限定标识符重定向
    
    [root@wqh06 ~]# cat > new.txt << EOF
    > WQH01
    > WQH02
    > EOF
    [root@wqh06 ~]# cat new.txt 
    WQH01
    WQH02
    
  • 相关阅读:
    Python 对象的绑定方法
    Python 类的属性
    Python 对象与类
    Python 面向对象
    Python Subprocess模块
    Python Hashlib模块
    Python Configparser模块
    Python XML模块
    Python Re模块
    Gridview中Datakeys 通过主键取得各列的值。(转)
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/12664000.html
Copyright © 2011-2022 走看看