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. gentoo(贱兔) Linux作业系统的基本使用

    emerge是gentoo linux的portage包管理器的命令行工具emerge的基础使用:emerge 软件包名:安装某软件包 emerge nanoemerge --ask 软件包名:交互式 ...

  2. PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法

    虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法.就当是扩展一下自己的知识体系. 切换用户 首先就是切换 ...

  3. 如何创建 Office LTSC 2021 VL(批量许可)版本的安装 ISO

    Office LTSC 2021 发布 2021 年 9 月 16 日,微软正式发布了支持 Office 2021 的部署工具(Office Deployment Tool),这意味着 Office ...

  4. webrtc源码阅读理解一

    webrtc是一个比较成熟的实时音视频处理开源项目,一上来老大就扔给我一本webrtc native实践,虽然狠下心"翻"完了一遍,但是还是云里雾里的,在经过几个月的摸索之后,我大 ...

  5. Python+Pygame开发太空大战/飞机大战完整游戏项目(附源代码)

    项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧!  游戏画面动态且丰富哦!   需求分析 利用Pyt ...

  6. HTML 网页开发、CSS 基础语法——六. HTML基本结构

    1.基本骨架 HTML文件最基本的四个标签,组成了网页的基本骨架,包括:<html>. <head>.<title>.<body>四组标签. ① < ...

  7. Loj#6053-简单的函数【Min25筛】

    正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数\(f(p^c)=p\ xor\ c\),求\(\sum_{i=1}^nf(i)\) 解题思路 异或这个东西不太好 ...

  8. CF755G-PolandBall and Many Other Balls【倍增FFT】

    正题 题目链接:https://www.luogu.com.cn/problem/CF755G 题目大意 \(n\)个东西排成一排,每个组可以选择一个单独的物品或者两个连续的物品,一个物品不同同时在两 ...

  9. Serverless 工程实践 | 零基础上手 Knative 应用

    作者|刘宇 前言:Knative 是一款基于 Kubernetes 的 Serverless 框架.其目标是制定云原生.跨平台的 Serverless 编排标准. Knative 介绍 Knative ...

  10. UOJ 2021 NOI Day2 部分题解

    获奖名单 题目传送门 Solution 不难看出,若我们单个 \(x\) 连 \((0,x),(x,0)\),两个连 \((x,y),(y,x)\) ,除去中间过对称轴的一个两个组,就是找很多个欧拉回 ...