CentOS下输入输出重定向
nux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。
Linux默认输入是键盘,输出是显示器。你可以用重定向来改变这些设置。比如用wc命令的时候本来是要手动输入一篇文字来计算字符数的,用了重定向后可以直接把一个已经写好的文件用‘<’指向这条命令,就直接可以统计这个文件的字符数等了。输出也是一样,你可以把屏幕输出重定向到一个文件里,再到文件里去看结果。重定向操作符可以用来将命令输入和输出数据流从默认位置重定向到其他位置,其输入或输出数据流的位置称为句柄;常见的句柄有三种,当然句柄可以自行扩展,一般的OS都提供类似的功能。句柄 句柄代号 句柄描述
STDIN 0 键盘输入
STDOUT 1 输出信息到提示符窗口
STDERR 2 输出错误信息到提示符窗口
默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置,可以是文件名或其他现有的句柄。
要指定重定向到现有句柄,请使用与 & 字符,后面接要重定向的句柄号(即 &句柄号)。
例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):2>&1
下表列出了可用于重定向输入和输出数据流的操作符:
Linux重定向操作符 功能描述
> 将命令输出写入文件或设备,而不是命令提示符或句柄
< 从文件而不是从键盘或句柄读入命令输入
>> 将命令输出添加到文件末尾而不删除文件中已有的信息
>& 将一个句柄的输出写入到另一个句柄的输入中
<& 从一个句柄读取输入并将其写入到另一个句柄输出中
| 从一个命令中读取输出并将其写入另一个命令的输入中;也称为管道操作符
现在我们回过头来看看上面的那条语句mysh > mylog.txt 2>&1就可明白:
> mylog.txt意思是将标准输出重定向到mylog.txt,等价于mysh 1> mylog.txt;
2 >& 1 意思是将错误输出重定向到句柄1标准输出;综合起来就是mysh命令执行过程中产生的标准输出和错误输出都会被重定向到mylog.txt中;
重定向的功能十分强大,有兴趣的可以去尝试各种不同的组合,看看前后位置变下会有什么结果?
某些时候我们可能并不希望记录什么标准输出或者是错误输出,那可以用mysh >null 2>null或者mysh >/dev/null 2>/dev/null;
I/O重定向详解
1、 基本概念(这是理解后面的知识的前提,请务必理解)
a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;
c、 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;
d、 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;
e、 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;
f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;
g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
h、 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;
i、 bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;
j、 ( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。
k、 exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
2、 基本IO
cmd > file 把 stdout 重定向到 file 文件中;
cmd >> file 把 stdout 重定向到 file 文件中(追加);
cmd 1> fiel 把 stdout 重定向到 file 文件中;
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;
cmd 2> file 把 stderr 重定向到 file 文件中;
cmd 2>> file 把 stderr 重定向到 file 文件中(追加);
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat <>file 以读写的方式打开 file;
cmd < file cmd 命令以 file 文件作为 stdin;
cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。
3、 进阶IO
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
<&n 标准输入复制自文件描述符 n;
<&- 关闭标准输入(键盘);
>&- 关闭标准输出;
n<&- 表示将 n 号输入关闭;
n>&- 表示将 n 号输出关闭;
上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:
... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。
... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)
我们对 2>&1详细说明一下 :2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的!但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。
exec 0exec 1>outfilename # 打开文件outfilename作为stdout。
exec 2>errfilename # 打开文件 errfilename作为 stderr。
exec 0<&- # 关闭 FD0。
exec 1>&- # 关闭 FD1。
exec 5>&- # 关闭 FD5。
- 1 COMMAND_OUTPUT >
- 2 # 重定向stdout到一个文件.
- 3 # 如果没有这个文件就创建, 否则就覆盖.
- 4
- 5 ls -lR > dir-tree.list
- 6 # 创建一个包含目录树列表的文件.
- 7
- 8 : > filename
- 9 # > 会把文件"filename"截断为0长度.
- 10 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
- 11 # : 是一个占位符, 不产生任何输出.
- 12
- 13 > filename
- 14 # > 会把文件"filename"截断为0长度.
- 15 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
- 16 # (与上边的": >"效果相同, 但是在某些shell下可能不能工作.)
- 17
- 18 COMMAND_OUTPUT >>
- 19 # 重定向stdout到一个文件.
- 20 # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
- 21
- 22
- 23 # 单行重定向命令(只会影响它们所在的行):
- 24 # --------------------------------------------------------------------
- 25
- 26 1>filename
- 27 # 重定向stdout到文件"filename".
- 28 1>>filename
- 29 # 重定向并追加stdout到文件"filename".
- 30 2>filename
- 31 # 重定向stderr到文件"filename".
- 32 2>>filename
- 33 # 重定向并追加stderr到文件"filename".
- 34 &>filename
- 35 # 将stdout和stderr都重定向到文件"filename".
- 36
- 37 #==============================================================================
- 38 # 重定向stdout, 一次一行.
- 39 LOGFILE=script.log
- 40
- 41 echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
- 42 echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
- 43 echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
- 44 echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
- 45 # 每行过后, 这些重定向命令会自动"reset".
- 46
- 47
- 48
- 49 # 重定向stderr, 一次一行.
- 50 ERRORFILE=script.errors
- 51
- 52 bad_command1 2>$ERRORFILE # 错误消息发到$ERRORFILE中.
- 53 bad_command2 2>>$ERRORFILE # 错误消息添加到$ERRORFILE中.
- 54 bad_command3 # 错误消息echo到stderr,
- 55 #+ 并且不出现在$ERRORFILE中.
- 56 # 每行过后, 这些重定向命令也会自动"reset".
- 57 #==============================================================================
- 58
- 59
- 60
- 61 2>&1
- 62 # 重定向stderr到stdout.
- 63 # 得到的错误消息与stdout一样, 发送到一个地方.
- 64
- 65 i>&j
- 66 # 重定向文件描述符i 到 j.
- 67 # 指向i文件的所有输出都发送到j中去.
- 68
- 69 >&j
- 70 # 默认的, 重定向文件描述符1(stdout)到 j.
- 71 # 所有传递到stdout的输出都送到j中去.
- 72
- 73 0< FILENAME
- 74 < FILENAME
- 75 # 从文件中接受输入.
- 76 # 与">"是成对命令, 并且通常都是结合使用.
- 77 #
- 78 # grep search-word <filename
- 79
- 80
- 81 [j]<>filename
- 82 # 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
- 83 # 如果文件"filename"不存在, 那么就创建它.
- 84 # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
- 85 #
- 86 # 这种应用通常是为了写到一个文件中指定的地方.
- 87 echo 1234567890 > File # 写字符串到"File".
- 88 exec 3<> File # 打开"File"并且给它分配fd 3.
- 89 read -n 4 <&3 # 只读4个字符.
- 90 echo -n . >&3 # 写一个小数点.
- 91 exec 3>&- # 关闭fd 3.
- 92 cat File # ==> 1234.67890
- 93 # 随机存储.
- 94
- 95
- 96
- 97 |
- 98 # 管道.
- 99 # 通用目的的处理和命令链工具.
- 100 # 与">"很相似, 但是实际上更通用.
- 101 # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
- 102 cat *.txt | sort | uniq > result-file
- 103 # 对所有的.txt文件的输出进行排序, 并且删除重复行,
- 104 # 最后将结果保存到"result-file"中.
可以将输入输出重定向和(或)管道的多个实例结合到一起写在一行上.
- 1 command < input-file > output-file
- 2
- 3 command1 | command2 | command3 > output-file
可以将多个输出流重定向到一个文件上.
- 1 ls -yz >> command.log 2>&1
- 2 # 将错误选项"yz"的结果放到文件"command.log"中.
- 3 # 因为stderr被重定向到这个文件中,
- 4 #+ 所有的错误消息也就都指向那里了.
- 5
- 6 # 注意, 下边这个例子就不会给出相同的结果.
- 7 ls -yz 2>&1 >> command.log
- 8 # 输出一个错误消息, 但是并不写到文件中.
- 9
- 10 # 如果将stdout和stderr都重定向,
- 11 #+ 命令的顺序会有些不同.
exec <filename 命令会将stdin重定向到文件中. 从这句开始, 后边的输入就都来自于这个文件了, 而不是标准输入了(通常都是键盘输入). 这样就提供了一种按行读取文件的方法, 并且可以使用sed 和/或 awk来对每一行进行分析.
使用exec重定向标准输入
1 #!/bin/bash
2 # 使用'exec'重定向标准输入.
3
4
5 exec 6<&0 # 将文件描述符#6与stdin链接起来.
6 # 保存了stdin.
7
8 exec < data-file # stdin被文件"data-file"所代替.
9
10 read a1 # 读取文件"data-file"的第一行.
11 read a2 # 读取文件"data-file"的第二行.
12
13 echo
14 echo "Following lines read from file."
15 echo "-------------------------------"
16 echo $a1
17 echo $a2
18
19 echo; echo; echo
20
21 exec 0<&6 6<&-
22 # 现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
23 #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
24 #
25 # <&6 6<&- 这么做也可以.
26
27 echo -n "Enter data "
28 read b1 # 现在"read"已经恢复正常了, 就是从stdin中读取.
29 echo "Input read from stdin."
30 echo "----------------------"
31 echo "b1 = $b1"
32
33 echo
34
35 exit 0
使用exec来重定向stdout
1 #!/bin/bash |
使用exec在同一脚本中重定向stdin和stdout
1 #!/bin/bash |
I/O重定向是一种避免可怕的子shell中不可存取变量问题的方法.
避免子shell
1 #!/bin/bash |
CentOS下输入输出重定向的更多相关文章
- Linux centos7 shell 介绍、 命令历史、命令补全和别名、通配符、输入输出重定向
一.shell介绍 shell脚本是日常Linux系统管理工作中必不可少的,不会shell,就不是一个合格管理员. shell是系统跟计算机硬件交互使用的中间介质,一个系统工具.实际上在shell和计 ...
- CentOS下Apache配置多域名或者多端口映射
CentOS下Apache默认网站根目录为/var/www/html,假如我默认存了一个CI项目在html文件夹里,同时服务器的外网IP为ExampleIp,因为使用的是MVC框架,Apache需开启 ...
- CentOS 下运维自动化 Shell 脚本之 expect
CentOS 下运维自动化 Shell脚本之expect 一.预备知识: 1.在 Terminal 中反斜杠,即 "" 代表转义符,或称逃脱符.("echo -e与pri ...
- Linux Shell系列教程之(十六) Shell输入输出重定向
本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...
- 全面理解Linux输入输出重定向
全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解 Linux Shell 中支持输入输出重定向,用符号&l ...
- Linux学习笔记17——输入输出重定向
1 何谓输入输出重定向? 默认情况下输入是由键盘输入的.输出是默认的输出到屏幕上.而输入输出重定向就是改变默认的输入输出方向 2 freopen函数 freopen是被包含与stdio.h头文件中,是 ...
- shell之路【第四篇】输入输出重定向
输出重定向 命令输出重定向的语法为: command > file 或 command >> file 这样,输出到显示器的内容就可以被重定向到文件.果不希望文件内容被覆盖,可以使用 ...
- Linux第六节随笔 输入输出重定向 、管道、通配符、wc / grep / tr / sort / cut / which /whereis /locate /find /
三期第五讲 -高级文件管理1.输入输出重定向 ls -l /dev/stdin -> /proc/self/fd/0 标准输入 设备:键盘 标记:0 ls -l /dev/stdout -> ...
- Linux下Shell重定向
1. 标准输入,标准输出与标准错误输出 Linux下系统打开3个文件,标准输入,标准输出,标准错误输出. 标准输入:从键盘输入数据,即从键盘读入数据. 标准输出:把数据输出到终端上. 标准错误输出:把 ...
随机推荐
- 工作中的Buff加成-结构化思考力:自创独门武功 3-3-3原则
3-3-3原则 3秒钟 *思考三秒钟 沟通前根据交谈内容思考3秒钟,思考下具体需要表达什么,思考的主要点为What.Why.How. *冷静三秒钟 在沟通过程中,若遇到气氛不和谐,比如生气.愤恨等时, ...
- plsql连接oracle客户端(简单,实用方案)附件
plsql 连接 oracle 需要在本地安装oracle客户端(附件中下载): 将文件下载下来后,放到任意目录,例如 D:\instantclient_10_2 修改 tnsnames.ora 文件 ...
- 安全测试---AWVS简单安装介绍
使用AWVS对域名进行全局分析,深入探索: 首先,介绍一下AWVS这个工具. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网 ...
- todolist作业涉及知识点
window.event对象详细介绍 1.event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定 ...
- jquery.nav.js定位导航滚动插件
jQuery.nav.js插件代码: /* * jQuery One Page Nav Plugin * http://github.com/davist11/jQuery-One-Page-Nav ...
- “全栈2019”Java第四十三章:封装
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Linux下的find查找命令
Linux下的查找命令有:which(查看可执行文件的位置),whereis(查看指定文件的位置),locate(配合数据库查找指定文件的内容).find(在磁盘上查找文件).grep(使用正则表达式 ...
- Golang开发环境搭建
1.下载golang安装包: 下载地址:https://golang.google.cn/dl/ 2.安装Eclipse 下载goclipse 插件 3.配置 Go 的编译器 4.写代码. packa ...
- JAVA数据结构--二叉查找树
二叉查找树定义 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tr ...
- android 捕获未try的异常
1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...