1. I/O重定向

  默认情况下,有3个“文件”处于打开状态,stdin,stdout,stderr;重定向的解释:捕捉一个文件,命令,程序,脚本或者脚本中的代码块的输出,然后将这些输出作为输入发送到另一个文件,命令,程序或者脚本中。

  每个打开的文件都会被分配一个文件描述符,stdin,stdout,stderr的文件描述符分别是0,1,2.除了这3个文件,对于其他需要打开的文件,保留文件描述符3~9.在某些情况下,将这些额外的文件描述符分配给stdin,stdout或stderr作为临时的副本链接也是非常有用的。在经过复杂的重定向和刷新之后需要把他们恢复成正常状态。可以使用shell内建ulimit -n查看最大文件描述符,一般未1024.

ulimit描述如下:

              -a     All current limits are reported
-b The maximum socket buffer size
-c The maximum size of core files created
-d The maximum size of a process's data segment
-e The maximum scheduling priority ("nice")
-f The maximum size of files written by the shell and its children
-i The maximum number of pending signals
-l The maximum size that may be locked into memory
-m The maximum resident set size (many systems do not honor this limit)
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-q The maximum number of bytes in POSIX message queues
-r The maximum real-time scheduling priority
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell and, on some systems, to its children
-x The maximum number of file locks
-T The maximum number of threads

ulimit -a结果如下:

core file size          (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 513989
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
 1 COMMAND_OUTPUT >
2 #将stdout重定向到一个文件,如果这个文件不存在,就创建,否则就覆盖
3 : > filename
4 #将filename变成一个空文件(size=0);
5 # :是一个占位符,不产生任何输出
6 > filename
7 #同上,某些shell可能不支持
8
9 COMMAND_OUTPUT >>
10 #将stdout重定向到一个文件,如果这个文件不存在,就创建,否则就追加
11 1> filename
12 #重定向stdout到filename;
13 1>> filename
14 #重定向并追加stdout到filename;
15
16 M>N
17 #M是文件描述符,默认是1;N是一个文件名;文件描述符M被重定向到文件N
18
19 M>&N
20 #M是文件描述符,默认是1;N是一个文件描述符;文件描述符M被重定向到文件N
21
22 2>&1
23 #重定向stderr到stdout,将错误消息的输出,发送到与标准输出所指向的方向
24
25 i>&j
26 #重定向描述符i到j,默认i是1
27
28 0<FILENAME
29 <FILENAME
30 #从文件中接受输入
31
32 [j]<>filename
33 #为了读写filename,把filename打开,并且将文件描述符j分配给它;如果filename不存在,就创建;如果描述符j没指定,默认fd 0,stdin
34 echo 1234567890 > File # 写字符串到"File".
35 exec 3<> File # 打开"File"并且将fd 3分配给它.
36 read -n 4 <&3 # 只读取4个字符.
37 echo -n . >&3 # 写一个小数点
38 exec 3>&- # 关闭fd 3.
39 cat File # ==> 1234.67890
 1 n<&-
2 #关闭输入文件描述符n
3
4 0<&-,<&-
5 #关闭stdin
6
7 n>&-
8 #关闭输出文件描述符n
9
10 1>&-,>&-
11 #关闭stdout

2. 使用exec进行I/O重定向

参考资料:http://www.linuxplus.org/kb/x13380.html

exec <filename命令会将stdin重定向到文件中. 从这句开始, 所有的stdin就都来自于这个文件了, 而不是标准输入(通常都是键盘输入). 这样就提供了一种按行读取文件的方法, 并且可以使用sed和/或awk来对每一行进行分析.

使用exec进行IO重定向可以避免子shell的产生

 1 #!/bin/bash
2 #avoid_subshell.sh
3
4 Lines=0
5 echo
6 cat myfile.txt | while read line; #管道会产生子shell
7 do {
8 echo $line
9 (( Lines++ )); #Lines的自加属于子shell范围,外部不能访问
10 echo "in while Lines is $Lines"
11 }
12 done
13
14 echo "Number of lines read = $Lines" #结果为0,显示的结果是错误的
15 echo "------------------------"
16
17 exec 3<> myfile.txt #使用exec打开文件,使用文件描述符3
18 while read line <&3
19 do {
20 echo "$line"
21 (( Lines++ )); #不会产生子shell
22 }
23 done
24 exec 3>&-
25 echo "Number of lines read = $Lines" #Lines输出的值是正确的
26 exit 0

上述代码中应该增加一行"exec 3<&-";原因:使用<>打开文件的读写操作之后,在关闭时,需要分别关闭文件的读和写,需要分开操作。

其中,myfile.txt的内容如下:

1 Line 1.
2 Line 2.
3 Line 3.
4 Line 4.
5 Line 5.
6 Line 6.
7 Line 7.
8 Line 8.

3. 代码块重定向

参考资料:http://www.linuxplus.org/kb/redircb.html

下面是for循环的重定向example:

 1 #!/bin/bash
2
3 if [ -z "$1" ]
4 then
5 Filename=names.data #
6 else
7 Filename=$1
8 fi
9
10 #Filename=${1:-names.data} #这句可以代替上面的if语句(参数替换)
11
12
13 Savefile=$Filename.new #保存最终结果的文件
14 FinalName=Jonah #终止“read”时的名称
15
16 line_count=`wc $Filename | awk '{ print $1 }'` #目标文件的行数
17 echo "line_count=$line_count"
18
19 for name in `seq $line_count` #seq会打印出数字序列
20 do
21 read name
22 echo "$name"
23 if [ "$name" = "$FinalName" ]
24 then
25 break
26 fi
27 done < "$Filename" > "$Savefile" #重定向stdin到文件$Filename,
28 # 将输出重定向到$Savefile文件
29
30 exit 0

shell IO重定向的更多相关文章

  1. Bash : IO 重定向

    标准输入/输出(standard I/O)可能是软件设计原则里最重要的概念了.这个概念就是:程序应该有数据的来源端.数据的目的端(输出结果的地方)已经报告问题的地方,它们分别被称为标准输入(stand ...

  2. linux学习14 Linux运维高级系统应用-glob通配及IO重定向

    一.回顾 1.bash基础特性:命令补全,路径补全,命令引用 2.文件或目录的复制,移动及删除操作 3.变量:变量类型 存储格式,数据表示范围,参与运算 二.bash的基础特性 1.globbing: ...

  3. 四、IO重定向和管道以及基本文本处理工具

    一.三种IO设备 程序:数据+指令 或 数据结构+算法程序必须能够读入输入然后经过加工来产生结果,其接受的输入可以是变量.数组.列表.文件等等,生产出来的结果可以使变量.数组.列表.文件等等.即:程序 ...

  4. Linux Shell系列教程之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  5. shell 数据流重定向操作符总结

    最近看了鸟哥私房菜关于shell数据流重定向的内容,总结一下. 操作符: 1.标准输入(stdin):代码为0,符号:< 或者<< 2.标准输出(stdout):代码为1,符号:&g ...

  6. [C++]竞赛模板·数据统计与IO(重定向版与非重定向版)

      /* 数据统计与IO 重定向版模板 描述:本机测试用文件数据流重定向,一旦提交到比赛就自动“删除”重定向语句 */ # define LOCAL #include<stdio.h> # ...

  7. IO重定向与管道

    一.三种IO设备 程序:数据+指令 或 数据结构+算法 程序必须能够读入输入然后经过加工来产生结果,其接受的输入可以是变量.数组.列表.文件等等,生产出来的结果可以使变量.数组.列表.文件等等.即: ...

  8. Perl IO:IO重定向

    文件句柄和文件描述符的关系 文件描述符是操作系统的资源,对于实体文件来说,每打开一次文件,操作系统都会为该进程分配一个文件描述符来关联(指向)这个文件,以后操作文件数据都根据这个文件描述符来操作,而不 ...

  9. [转]linux shell数据重定向(输入重定向与输出重定向)详细分析

      在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件 ...

随机推荐

  1. 【Nginx】Linux常用命令------启动、停止、重启

    启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /us ...

  2. electron-vue 开发问题合集

    (一)Found 'electron' but not as a devDependency, pruning anyway 原因:对electron没有严格要求的话可以忽略,不影响打包,但会影响第三 ...

  3. 分组密码(三)DES 算法— 密码学复习(六)

    在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...

  4. 基于swoole框架hyperf开发的纯API接口化的后台RBAC管理工具hyperfly@v1.0.0发布

    hyperfly@v1.0.0发布 本文地址http://yangjianyong.cn/?p=323转载无需经过作者本人授权 github地址:https://github.com/vankour/ ...

  5. composer 下载包慢

    方法一: 修改 composer 的全局配置文件(推荐方式) 打开命令行窗口(windows用户)或控制台(Linux.Mac 用户)并执行如下命令: composer config -g repo. ...

  6. Linux系列(7) - 链接命令

    硬链接 拥有相同的i节点和存储block块,可以看做事同一个文件 可通过i节点识别 不能跨分区 不能针对目录使用,只能针对文件 软链接 类似Windows快捷方式 软链接拥有自己的i节点和block块 ...

  7. PC+PLC通过Modbus协议构建工控系统

    一. 概述 工业设备采用HMI+PLC控制是比较常见的方案,随着工业自动化的要求越来越高,现在很多设备都要求接入企业MES系统,MES系统一般为WEB系统,接口形式大部分为HTTP协议,这种传统方案和 ...

  8. [转载]CentOS 下安装LEMP服务(Nginx、MariaDB/MySQL和PHP)

    LEMP 组合包是一款日益流行的网站服务组合软件包,在许多生产环境中的核心网站服务上起着强有力的作用.正如其名称所暗示的, LEMP 包是由 Linux.nginx.MariaDB/MySQL 和 P ...

  9. Python3入门系列之-----json与字典转换

    json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写 JSON 函数 使用 JSON 函数需要导入 json 库:import js ...

  10. MyBatis封装对象内的List出现的问题

    本篇文章问题1:wife的复数形式是wives,不是wifes,英语不好请见谅. 对象举例: class User { private String username; private List< ...