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. java线程day-01

    综述:下面写的是我学习java线程时做的一些笔记和查阅的一些资料总结而成.大多以问答的形式出现. 一.什么是线程? 答:线程是一个轻量级的进程,现在操作系统中一个基本的调度单位,而且线程是彼此独立执行 ...

  2. 在PHP中灵活使用foreach+list处理多维数组

    先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如: $arr = [ [1, 2, [3, 4]], [5, 6, [7, 8]], ]; 我们需要的结果是元素1变成1 ...

  3. linux新安装了php,但是使用mysqli连接数据库一直超时

    centos7+mysql5.5+php5.6+nginx mysql php nginx都安装完成,然后启动了,网站也运行, 但是php文件中使用mysqli_connect时一直超时,有时也报错, ...

  4. Java面向对象系列(5)- 构造器详解

    构造器: 和类名相同 没有返回值 作用: new本质在调用构造器 初始化对象的值 注意点: 定义了有参构造之后,如果想要使用有参构造,必须显示的定义一个无参构造 IDEA快捷键: Alt + Inse ...

  5. Java基础系列(2)- Java开发环境搭建

    JDK下载与安装 安装JDK 1.百度搜素JDK8,找到下载地址 2.下载电脑对应的版本 3.双击安装JDK 4.记住安装的路径,可以自定义,默认路径如图 卸载JDK 删除Java安装目录 删除环境变 ...

  6. Django3.2边学边记—Adimn站点管理

    准备工作 创建管理员的用户名和密码: python manage.py createsuperuser 根据提示创建用户名 密码 在admin.py中注册模型类 from django.contrib ...

  7. php 解决返回数据 数字 变成科学计数法后转换问题

    链接 https://blog.csdn.net/liuxin_0725/article/details/81514961 问题 id int型 数字过长,json_decode的时候已经转成科学计数 ...

  8. mysql允许别人通过ip访问本机mysql数据

    要想允许别人通过ip访问本机mysql数据库,首先要是本机的mysql允许别的ip访问,也就是授权:其次别人的代码里,要写对本机的ip. 一.本机mysql的授权操作 1.cmd 进入控制台 2.输入 ...

  9. python线程threading

    线程示例: import threading import time # 唱歌任务 def sing(): # 扩展: 获取当前线程 # print("sing当前执行的线程为:" ...

  10. 对帧率、I/P率、I帧间隔的理解

    码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒.通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比 ...