相信熟悉linux的童鞋不会对这四个符合陌生,shell脚本的文件流有时候真的挺容易搞晕人的,下面我们一起了解一下吧

参考链接:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

文件描述符

linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2

以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。

linux shell下常用输入输出操作符是:

1.  标准输入   (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0   0代表:/dev/stdin 
2.  标准输出   (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1  1代表:/dev/stdout
3.  标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr

>,>>

输出重定向:表示把将输出重定向到屏幕或者设备或者文件

下面我们直接看一些例子吧

qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1
ls: 无法访问t.txt1: 没有那个文件或目录
t.txt
# 正确输出和错误输出都显示在屏幕上
# 我们试着把正确输出重定向到suc.txt(success),可以看到屏幕输出上只有错误输出了,
#从这里也可以看出,默认的正确输出(代码为1,)是可以忽略不写的
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >suc.txt
ls: 无法访问t.txt1: 没有那个文件或目录
qiweijie@qiweijie:~/study_shell$ cat suc.txt
t.txt
# 正确输出和错误输出分别输出到不同的文件
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >suc.txt >err.txt
qiweijie@qiweijie:~/study_shell$ cat suc.txt err.txt
t.txt
ls: 无法访问t.txt1: 没有那个文件或目录
# >> 这样写表示追加到文件
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >>suc.txt >>err.txt
qiweijie@qiweijie:~/study_shell$ cat suc.txt err.txt
t.txt
t.txt
ls: 无法访问t.txt1: 没有那个文件或目录
ls: 无法访问t.txt1: 没有那个文件或目录
# &[-,,] 分别表示关闭对应的标识,正确输出,错误输出
# 关闭错误输出
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >&-
t.txt
# 错误输出重定向到/dev/null
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >/dev/null
t.txt
# 错误输出重定向到到文件
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >err1.txt
t.txt
# 关闭正确输出和错误输出
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >&- >&-
# 都输出到/dev/null
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >/dev/null >/dev/null
# 把错误输出重定向到正确输出,正确输出重定向到/dev/null
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >/dev/null >&
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >/dev/null >&
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 >ttt.txt >&
qiweijie@qiweijie:~/study_shell$ cat ttt.txt
ls: 无法访问t.txt1: 没有那个文件或目录
t.txt
# &代表所有输出
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 &>/dev/null
qiweijie@qiweijie:~/study_shell$ ls t.txt t.txt1 &>te.txt
qiweijie@qiweijie:~/study_shell$ cat te.txt
ls: 无法访问t.txt1: 没有那个文件或目录
t.txt

输入重定向<,<<

也是直接来看一些例子吧

# cat命令表示从屏幕获取输入,然后输出
qiweijie@qiweijie:~/study_shell$ cat
sadf
sadf
# 最简单的例子,从屏幕获取输入,然后重定向给qwj(这里用到是的是输出重定向
qiweijie@qiweijie:~/study_shell$ cat > qwj
qiweijie shi 2B
qiweijie@qiweijie:~/study_shell$ cat qwj
qiweijie shi 2B
#这里首先是从文件qwj获取输入给cat,然后cat输入重定向给qwj1
qiweijie@qiweijie:~/study_shell$ cat > qwj1 <qwj
qiweijie@qiweijie:~/study_shell$ cat qwj1
qiweijie shi 2B
# << 两个小于号连在一起表示接受一个输入结束的标识,当输入这个标识是结束输入
qiweijie@qiweijie:~/study_shell$ cat > qq << eof
> q
> w
> j
> eof
qiweijie@qiweijie:~/study_shell$ cat qq
q
w
j
qiweijie@qiweijie:~/study_shell$ cat > qqq << e
> q
> w
> e
qiweijie@qiweijie:~/study_shell$ cat qqq
q
w
qiweijie@qiweijie:~/study_shell$

exec绑定重定向

# 绑定新的文件描述符之前的状态
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd # 绑定一个新的文件描述符6,并且绑定标准输出(相当于给标准输出保存一个临时copy)
qiweijie@qiweijie:~/study_shell$ exec >&
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd # 绑定标准输出给suc.txt
qiweijie@qiweijie:~/study_shell$ exec >suc.txt
# 发现标准输出都没有了啊
qiweijie@qiweijie:~/study_shell$ ls -al
# 俨然发现suc.txt已经是输出文件
qiweijie@qiweijie:~/study_shell$ cat suc.txt
cat: suc.txt:输入文件是输出文件
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd
# 把标准输出绑定回来
qiweijie@qiweijie:~/study_shell$ exec >&
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd # 关闭自定义的文件描述符
qiweijie@qiweijie:~/study_shell$ exec >&-
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd qiweijie@qiweijie:~/study_shell$ cat suc.txt
总用量
drwxrwxr-x qiweijie qiweijie 11月 : .
drwxr-xr-x qiweijie qiweijie 11月 : ..
-rw-rw-r-- qiweijie qiweijie 11月 : atlga.xml
-rw-rw-r-- qiweijie qiweijie 11月 : atlga.xml.old
-rw-rw-r-- qiweijie qiweijie 11月 : dos-file.txt
-rw-rw-r-- qiweijie qiweijie 11月 : err1.txt
-rw-rw-r-- qiweijie qiweijie 11月 : err.txt
-rw-rw-r-- qiweijie qiweijie 11月 : example.txt
-rwxrwxr-x qiweijie qiweijie 11月 : finduser
-rw-rw-r-- qiweijie qiweijie 11月 : g
-rw-rw-r-- qiweijie qiweijie 11月 : merge-sales.sh
-rw-rw-r-- qiweijie qiweijie 11月 : my-friends
-rw-rw-r-- qiweijie qiweijie 11月 : my-friends.sh
-rwxrwxr-x qiweijie qiweijie 11月 : nusers
-rw-rw-r-- qiweijie qiweijie 11月 : passwd.txt
-rw-rw-r-- qiweijie qiweijie 11月 : qq
-rw-rw-r-- qiweijie qiweijie 11月 : qqq
-rw-rw-r-- qiweijie qiweijie 11月 : quotas
-rw-rw-r-- qiweijie qiweijie 11月 : qwj
-rw-rw-r-- qiweijie qiweijie 11月 : qwj1
-rw-rw-r-- qiweijie qiweijie 11月 : sales
-rw-rw-r-- qiweijie qiweijie 11月 : suc.txt
-rw-rw-r-- qiweijie qiweijie 11月 : te.txt
-rwxrwxr-x qiweijie qiweijie 11月 : trace1.sh
-rw-rw-r-- qiweijie qiweijie 11月 : ttt.txt
-rw-rw-r-- qiweijie qiweijie 11月 : t.txt
-rw-rw-r-- qiweijie qiweijie 11月 : unix-file.txt
-rw-rw-r-- qiweijie qiweijie 11月 : unix.txt
-rw-rw-r-- qiweijie qiweijie 11月 : UN工x-file.txt # 如果直接把标准输出绑定到文件,那么问题就是,你再也变不回来了
qiweijie@qiweijie:~/study_shell$ exec >suc.txt
qiweijie@qiweijie:~/study_shell$ cat suc.txt
cat: suc.txt:输入文件是输出文件
qiweijie@qiweijie:~/study_shell$ exec >&-
qiweijie@qiweijie:~/study_shell$ cat suc.txt
cat: 标准输出: 错误的文件描述符
qiweijie@qiweijie:~/study_shell$ ls /proc/self/fd
ls: 写入错误: 错误的文件描述符
qiweijie@qiweijie:~/study_shell$

相信通过这些例子,大家对文件描述符和<,<<,>,>>这四个符号应该有一定的印象了吧

如果定界符以任何一种形式的引号括起来, Shell 便不会处理输入的内文:

qiweijie@qiweijie:~/study_shell$ cat << 'e'of
> echo $file
> eof
echo $file
qiweijie@qiweijie:~/study_shell$ cat << eof
> echo $file
> eof
echo nusers
qiweijie@qiweijie:~/study_shell$

以<>打开一个文件作为输入与输出之用

警告<>最初是出现在最早的 V7 Bourne Shell 上,不过并没有形成文档,且经验告诉我们,在
很多环境下,它的运行会有点问题。基于此,它并未被大家广泛了解或使用。虽然它已在
1992 年的 POSIX 标准中标准化,但很多系统里的 /bin/sh 并不支持它。因此如果你对程
序可移植性的要求很高,最好避免使用。

qiweijie@qiweijie:~/study_shell$ (cd test/) ;pwd
/home/qiweijie/study_shell
qiweijie@qiweijie:~/study_shell$ { cd test/ ;} ;pwd
/home/qiweijie/study_shell/test

shell 中的<,<<,>,>>的更多相关文章

  1. linux shell 中的sleep命令

    开始还以为是这样的语法: sleep(1), 后面发现是: linux shell 中的sleep命令 分类: LINUX 在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小 ...

  2. shell 中的与、或表达式

    今天总结一下linux shell中逻辑关机表达方式.逻辑与的表达: 1).if [ $xxx=a -a $xx=b ] 注:-a表示and的意思 2).if [ $xxx=a ] && ...

  3. shell简单用法笔记(shell中数值运算)二

    shell中变量值,如果不手动指定类型,默认都是字符串类型: 例如: a= b= c=$a+#b echo $c 结果会输出:123+456 shell中,如果要进行数值运算,可以通过一下方法: 方法 ...

  4. shell中{}的妙用

    shell中${}的妙用   1. 截断功能 ${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:    拿 ...

  5. shell中命令之间数据的传递

    1.管道 "|" ls | cat -n > out.txt 2. 子shell 2.1 子shell 说明 在shell脚本中可以用()操作符可以定义一个子shell #/ ...

  6. shell中&&和||的使用方法

    测试题: [ -z "" ] && echo 0 || echo 1 的结果是多少 看看这两个 && || 的用户  http://blog.csd ...

  7. 任督二脉之Shell中的正则表达式

    VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...

  8. shell中条件判断if中的-z到-d的意思

    shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 ...

  9. shell中的循环

    shell中的循环 for循环 类似于C语言的步长控制 例如: ;i<=;i++)); ); done 将1到10,依次乘以4,然后打印出来. 这里顺便提一下,shell里面表达式的计算,可以有 ...

  10. shell中&&和||的使用方法_转

    shell中&&和||的使用方法 &&运算符:   command1  && command2   &&左边的命令(命令1)返回真(即返 ...

随机推荐

  1. POJ1236:Network of Schools——题解

    http://poj.org/problem?id=1236 首先还是缩点,然后入度为0的点的个数就是你要投文件个数. 然后我们对于入度和出度为0的点的个数取最大值即为答案. (简单证明:入度和出度为 ...

  2. 模板:数论 & 数论函数 & 莫比乌斯反演

    作为神秘奖励--?也是为了方便背. 所有的除法都是向下取整. 数论函数: \((f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\) \((Id*\mu)(n)=\sum_{d ...

  3. UVA.10192 Vacation (DP LCS)

    UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...

  4. javascript实现deepEqual和shallowEqual

    function deepEqual(x, y) { if (x === y) { return true; } if (!(typeof x == "object" && ...

  5. JavaScript in 操作符

    JavaScript的in操作符可以用来判断一个属性是否属于一个对象,也可以用来变量一个对象的属性 1. 判断属性属于对象 var mycar = {make: "Honda", ...

  6. 【P2602】【ZJOI2012】数字计数

    传送门 Description 给定两个正整数\(a\)和\(b\),求在\([a,b]\)中的所有整数中,每个数码(\(digit\))各出现了多少次. Input 两个正整数\(a,b\) Out ...

  7. 【神仙题】【P1600】【NOIP2016D1T2】天天爱跑步

    传送门 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游 ...

  8. Mybatis手工写sql语句及Mapper.xml方法

    首先在项目中 建一个mapper包,然后在spring集合mybatis的配置文件中设置扫描这个mapper包 然后,建 封装查询结果需要的 pojo 然后,在 mapper包中创建 Mapper接口 ...

  9. 《时间序列分析及应用:R语言》读书笔记--第二章 基本概念

    本章介绍时间序列中的基本概念.特别地,介绍随机过程.均值.方差.协方差函数.平稳过程和自相关函数等概念. 2.1时间序列与随机过程 关于随机过程的定义,本科上过相关课程,用的是<应用随机过程&g ...

  10. Codeforces Round #343 (Div. 2) B

    B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megabytes input st ...