LinuxSHELL脚本中read、重定向和文件句柄和进程数目控制
1、把重定向作为read的输入
read可以从标准输入读取一行,下面就使用read配合重定向把文件作为read的标注输入。
#!/bin/bash #name: links.sh # Revision: 1.1 # Date: 2017// # Author: yemo # Email: memeda@163.com # Website: # Description: Print the ip-links # Notes: # ------------------------------------------------------------------------------- # Copyright: 2017 (c) yemo # License: GPL # while read line ;do echo "line=$line" sleep 2 done </home/yemo/model.txt #把文件作为read的的输入 unset line
接下来运行一下
root@yemo:/home/yemo# bash file_des.sh line=#!/bin/bash line=#name: links.sh line=# Revision: 1.1 line=# Date: 2017/6/ line=# Author: yemo line=# Email: memeda@163.com line=# Website: line=# Description: Print the ip-links line=# Notes: line=# -------------------------------------------------------------------------------
输出了我的bash头部模板文件的内容
2、再话文件描述符
文件在打开时候系统给每一个打开的文件分配用于维护的描述符,这通常包括系统打开文件描述符表,进程级的文件描述符表(文件操作符标志和文件句柄的引用),文件系统i-node表。
基本用法
exec fd<>file #创建一个文件句柄 exec fd>&- or exec -fd<& #关闭文件句柄
创建文件描述符后在/proc/PID/fd中新建,通过$$查看当前shell的PID。
root@yemo:/home/yemo# cd /proc/$$/fd root@yemo:/proc/6833/fd# ls 0 1 2 255
给文件/home/yemo/model.txt创建一个描述符fd6
root@yemo:/proc/6833/fd# exec 6<>/home/yemo/model.txt root@yemo:/proc/6833/fd# ls 0 1 2 255 6
打开fd6,查看内容
root@yemo:/proc/6833/fd# cat 6 #!/bin/bash #name: links.sh # Revision: 1.1 #后面挺长就省略了,这不是重点
我们可以通过fd6,读写文件model.txt
root@yemo:/proc/6833/fd# echo "hello girl" >>6 root@yemo:/proc/6833/fd# tail -1 6 hello girl
如果删除文件,fd6会怎么样呢
root@yemo:/proc/6833/fd# stat -c %i /home/yemo/model.txt #先查看下inode 128531 root@yemo:/proc/6833/fd# stat -c %i 6 49938 root@yemo:/proc/6833/fd# rm /home/yemo/model.txt root@yemo:/proc/6833/fd# ls 0 1 2 255 6
fd6显示成红色,表示文件已经不存在了,我们打开一下
root@yemo:/proc/6833/fd# cat 6 #!/bin/bash #name: links.sh # Revision: 1.1 #此处省略很多行 hello girl
依旧可以打开,文件的删除只是删除的上级目录的存在的一个文件名,当文件在使用时候,并不会释放inode,只要block的数据没被覆盖都可以找回来,这里文件不大直接打开fd6重定向回去就好。
3、通过fd把文件内容传给read
root@yemo:/proc/6833/fd# exec 6>&- #关闭文件句柄 root@yemo:/proc/6833/fd# ls 0 1 2 255
新建脚本测试一下
使用-u选项:
-u fdread from file descriptor FD instead of the standard input
#!/bin/bash #filename: file_des.sh # Revision: 1.1 # Date: 2017-06-09 # Author: yemo # Email: memeda@163.com # QQ: 787743742 # Website: # Description: # Notes: # ------------------------------------------------------------------------------- # Copyright: 2017 (c) yemo # License: GPL exec 6<>/home/yemo/model.txt #创建文件句柄(fd6) while read -u 6 line ;do #循环读取文件 echo "line=$line" sleep 2 done exec 6>&- #文件用完,关闭文件句柄 unset line #自定义变量,结束释放
执行结果:
root@yemo:/home/yemo# bash file_des.sh line=#!/bin/bash line=#name: links.sh line=# Revision: 1.1 line=# Date: 2017/6/ line=# Author: yemo line=# Email: memeda@163.com #后面的内容就省略了
表面上看来这么做和单独使用重定向效果一样,但是当程序需要多个输入时候,单独的重定向只能让read读取单独一个文件内容无法为每个单独指定输入。
4、通过文件句柄创建多进程
read -u 读取文件描述符的方式读取字符串
设置文件描述符中回车数量为预设进程数目
通过循环建立多进程
#!/bin/bash #filename: mproc.sh # Revision: 1.1 # Date: 2017-06-09 # Author: yemo # Email: memeda@163.com # QQ: 787743742 # Website: # Description: This is use for test shell multiprocess # Notes: # ------------------------------------------------------------------------------- # Copyright: 2017 (c) yemo # License: GPL # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # you should have received a copy of the GNU General Public License # # If any changes are made to this script, please mail me a copy of the changes # ------------------------------------------------------------------------------- #Version 1.0 # main_sub() { local loop_time=$(( $1 % 7 )) echo -e "$i\t----\t---$loop_time begin" sleep $loop_time echo -e "$i\t-----\t$loop_time end" } tmp_file="/tmp/.fifo-$$" mkfifo $tmp_file #创建fifo文件用于进程通信 exec 6<>$tmp_file #创建文件句柄6为管道 rm -f $tmp_file my_thread=6 #限制进程数 runtime=50 for (( i=0 ; i < $my_thread ; i++ )) ; do echo done >&6 #循环写入回车符到管道 for (( i=0 ; i < $my_thread ; i++ )) ; do read -u 6 #进程数量控制 { main_sub $i echo >&6 #每次函数执行完写入一个回车符,保证进程数目是指定的 }& #后台运行 done wait #父进程等待子进程结束后再退出 exec 6<&- exit 0
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
实战生产环境vCenter HA配置(VCSA6.5)
官方vsphere6.5 文档中心镇楼: http://pubs.vmware.com/vsphere-65/index.jsp#com.vmware.vsphere.avail.doc/GUID-4A626993-A829-495C-9659-F64BA8B560BD.html vCenter High Availability (vCenter HA) 可防止 vCenter Server Appliance 发生主机和硬件故障。修补 vCenter Server Appliance 时,解决方案的主动-被动架构还有助于显著缩短停机时间。 vCenter HA部署难度不大,个人强烈建议生产环境部署。 配置时会创建一个包含主动节点、被动节点和见证节点的三节点群集。 软件环境: ESXi主机版本6.5,vcenter版本VCSA6.5。 vcenter6.5不建议再使用windows版本,VCSA实在太好用了。 先看官方的vCenter HA要求。 tips:要求三台ESXi主机 严格按照以下顺序操作: 一、准备工作: 1、编辑VCSA虚拟机设置,添加一块HA网卡,建议跟原VCSA管理...
- 下一篇
51CTO博客移动化意味着什么?IT博主可以搞事情了!
我红着脸写下了这个标题。 就好比在21世纪的今天,我煞有介事地说:“手机能上网意味着什么?” 好在,很多看起来不可思议的事情,在特定的环境下,就没那么匪夷所思了。如果对山区孩子说这句话,你们会理解的。 51CTO汇聚着中国最精英的互联网IT人,然而,社区却还没有移动化。这真是不可思议。 好在,同行也不大给力,51CTO仍是IT技术平台的翘楚。所以,移动化虽姗姗来迟,也无大碍,有望后来居上。 一休昨天告诉我:博客的web网页上线了,能在手机上看博文了。 我说,等这一天好久了。 在手机上看到:67篇,1935条评论,71万阅读。 无比自恋地,在屏幕上抚摸着这些过往,感叹倘若我晚生十年,定是一枚红扑扑的自媒体,每天沉浸在“叮咚~又多了一块钱赞赏”的小确幸中。 “开个公众号吧~ 你如此才华膨胀灵感喷涌,曾有粉丝无数,你咋就不开一个呢?!” 这个蛊惑人心的念头,常在我耳边萦绕,让我找不着北,兴致勃勃开始构思。 然而,体内这些年培养的理性因子,又一次次推翻了我的构想。如同这些年我一次次地无情否定了客户们兴致勃勃的战略想法一样。 果然是,天道好轮回,苍天绕过谁。 理性告诉我,微信公众号是个孤岛。 如...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主