shell 重定向与文件描述符

简介:

【解释】

重定向: 是动作,一种操作的action行为

文件描述符: 名词,文件的另一种表示,linux一切皆文件。


【基础重定向形式】

< 输入重定向 用途星级: **
<< here-document  输入重定向

用途星级: ***

> 输出重定向 用途星级: *****
>> 追加 用途星级: *****



一、< 用法: cat 作为代表

cat功能:Concatenate FILE(s), or standard input, to standard output.


1 连接文件,输出到标准输出(即打印到屏幕)

2 标准输入,到标准输出(即打印到屏幕)


cat /etc/issue 等于 cat < /etc/issue 


但是左边用的是cat第一种功能, 右边用的是cat的第二种功能。




二、<< 的用法: 以word开始,以delimiter(和word要一样)结束,中间的就是文档内容了。cat作为代表


<<[-]word

    here-document

delimiter



[root@master std]# cat << EOF

>  i am linux

>  yes.

> EOF

 i am linux

 yes.

[root@master std]


注意:<< 文档here-document作为输入,cat在将here-document输出到屏幕上。


常用:在shell脚本中



三、> 的用法:

1 清空一个文件

> youfile

2 清空文件内容,在把新内容写入

echo "you content" > file.txt



四、>> 追加的用法 把内容追加到文件中


echo "test message" >> /var/log/message



【基础文件描述符形式】


数字代号 意义 用途
0 标准输入 STDIN *****
1 标准输出 STDOUT *****
2 错误输出 STDERR *****



【文件描述符和重定向的结合】

默认

< 等于 0<  标准输入

> 等于 1>  标注输出重定向


>> 等于1>>  标准输出追加


其他

2> 就只能 2>   错误输出重定向

2>> 就只能 >>  错误输出追加

&> 等于  > file 2>&1 标准输出和错误输出 重定向,只打开了一次文件。

&>> 等于 >> file 2>&1 标准输出和错误输出 追加,只打开了一次文件。



这里有一点需要理解,

为什么是

&>> 等于 >> file 2>&1 而不是 >> file 2>>&1  这个会报错。 

因为开始打开文件file,是追加形式,所以2>&1 就可以表示的是把错误输出到那个文件中即可(文件已已经打开且光标已经在行尾)。


重定向和追加的区别是:第一次打开文件的时候,是否把文件清空,定义光标的开始处。从首行第一个字符开始写入。

方式+写入=结果



分析一下几个echo 

echo "abc" > test.txt

echo "error" >> text.txt

echo "abc" >&2   #这一行表示的是错误输出 等于echo "abc" 1>&2,前面是一个默认简写而已



【自定义文件描述符】

创建自己的重定向,在shell中不局限与 0 1 2 这个三个默认的文件描述符。其实在shell中最多可以有9个打开的文件描述符。其他6个分别是3-8。并且可以当作输入输出重定向都可以。

可以将这些文件描述符中的任意一个分配给一个文件。


例子1:创建输出文件描述符

[root@master std]# cat test.sh 

1
2
3
4
5
#/bin/bash
exec  3> file3.txt
echo  "first line 1"
 
echo  "first line 3"  >&3


注:exec执行将文件描述符3重定向到file3.txt这个文件中。

体会下结果吧

[root@master std]# sh test.sh 

first line 1

[root@master std]# cat file3.txt 

first line 3


例子2: 脚本中文件作为重定向输入

1
2
3
4
5
#/bin/bash
exec  0<  /etc/issue
while  read  line;  do
     echo  $line
done


解释: 将文件/etc/issue 作为0文件描述符的输入。

read line默认为从文件描述符0(键盘)读入,二此时exec已经定义了输入来自/etc/issue文件,所以read 会去读/etc/issue这个文件,把当读取的一行的内容,赋值给line这个变量。while在循环读取文件中的一下行.....


等价于

1
2
3
4
#/bin/bash
cat  /etc/issue  | while  read  line;  do
     echo  $line
done



例子3: 关闭打开的文件描述符

1
2
3
4
5
#/bin/bash
exec  3>>  /etc/issue
echo  "this is last file"  >&3
exec  3>&-
echo  "test output"  >&3


注意:一旦关闭了文件描述符,就不能在脚本中向它写入任何数据了,否则shell会生成错误消息。

[root@master std]# sh test.sh      

test.sh: line 7: 3: Bad file descriptor




【至此】

你一定会很关系exec这个命令是干嘛的? 和source 和sh执行一个脚本有何不同?

看下篇。

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1832007如需转载请自行联系原作者

cuizhiliang
相关文章
|
6月前
|
Shell 数据处理
Shell编程中,输入/输出重定向和管道
Shell编程中,输入/输出重定向和管道
44 2
|
6月前
|
数据挖掘 Shell
在Shell中,标准输出重定向
在Shell中,标准输出重定向
67 1
|
1月前
|
Unix Shell Linux
Shell 输入/输出重定向
10月更文挑战第4天
21 8
|
5月前
|
Unix Shell Linux
Shell 重定向:控制数据流向的艺术
在Unix/Linux中,Shell提供输入输出重定向来灵活控制数据流。了解和运用重定向能提升Shell效率。标准输入(0)、输出(1)和错误输出(2)是基础。`&gt;`用于覆盖输出,`&gt;&gt;`用于追加,而`&lt;`用于改变输入源。错误输出可单独重定向,如`2&gt;`或`2&gt;&gt;`。组合使用如`2&gt;&1`可合并输出和错误到同一文件。输入重定向示例:`cat &lt;&lt;END`读取直到`END`。掌握这些,可高效管理命令输出。
48 0
|
6月前
|
Shell
shell 命令(一)概述【别名、 bash重定向 、定义变量】
shell 命令(一)概述【别名、 bash重定向 、定义变量】
58 0
|
6月前
|
Unix Shell Linux
在Unix/Linux Shell中,管道(`|`)和重定向
在Unix/Linux Shell中,管道(`|`)和重定向
91 1
|
6月前
|
Shell
在Shell中,您可以同时重定向标准输出(STDOUT)和错误输出(STDERR)
在Shell中,您可以同时重定向标准输出(STDOUT)和错误输出(STDERR)
460 1
|
6月前
|
Shell 数据处理
shell的重定向
shell的重定向
97 2
|
6月前
|
机器学习/深度学习 Unix Shell
Shell编程基础入门(Bash|变量与输入输出重定向2&1)
Shell编程基础入门(Bash|变量与输入输出重定向2&1)
119 0