设为首页 收藏本站
查看: 802|回复: 0

shell 重定向与文件描述符

[复制链接]

尚未签到

发表于 2018-8-27 12:25:53 | 显示全部楼层 |阅读模式
  【解释】
  重定向: 是动作,一种操作的action行为
  文件描述符: 名词,文件的另一种表示,linux一切皆文件。
  【基础重定向形式】
追加用途星级: *****  一、< 用法: cat 作为代表
  cat功能:Concatenate FILE(s), or standard input, to standard output.
  1 连接文件,输出到标准输出(即打印到屏幕)
  2 标准输入,到标准输出(即打印到屏幕)
  cat /etc/issue 等于 cat < /etc/issue
  但是左边用的是cat第一种功能, 右边用的是cat的第二种功能。
  二、 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
#/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: 脚本中文件作为重定向输入
#/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在循环读取文件中的一下行.....
  等价于
#/bin/bash  
cat /etc/issue |while read line; do
  
    echo $line
  
done
  例子3: 关闭打开的文件描述符
#/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执行一个脚本有何不同?
  看下篇。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557315-1-1.html 上篇帖子: shell案例 - 统计用户上传文件的时间 下篇帖子: shell脚本简单使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表