星空网 > 软件开发 > 操作系统

遇到shell重定向的一个奇怪问题:消失的标准输入!

需求:
把找到的文件逐行输出,然后用rm在许可的情况下删除
 
前置准备: 
$lsrm.sh test1 test2 test3 test4 test5 test6


$cat rm.sh#! /bin/bashwhile read fileinfodo   rm -iv $fileinfodone< <( find . -name 'test*' -print )

第一次执行结果:

$bash rm.shrm:是否删除普通文件“./test2”?

出现的问题:

虽然rm显示了询问信息,却并不关心我输入的是什么(就没给我机会),也没有删除文件


第一次结果分析:
rm -iv需要从标准输入中获取允许,但标准输入已经被重定向为’done< <( find $path -type f -print )‘,所以rm只能从这获取输入了,也造成了这一次执行的令就无效了,然后read和rm就不断地逐次消耗掉输入的行,也就什么都没做了;
 
 第二次前置准备
$lsrm2.sh test1 test2


$cat test1test1test2test3test4test5test6


 程序解释:
当每次read到的内容不为空就输出到屏幕,count统计的是尝试的删除次数
$cat rm2.sh#! /bin/bashcount=0while read infodo  if [ ! -z info ]    then echo $info:not null  fi  rm -iv test2  let count++  echo $countdone< test1

第二次执行结果:

 

$bash rm2.shtest1:not_nullrm:是否删除普通文件 “test2”?1test3:not_nullrm:是否删除普通文件 “test2”?2test5:not_nullrm:是否删除普通文件 “test2”?3


验证分析:
符合第一次结果分析的猜测;
解决方案:
将原标准输入(键盘输入)存放在新的文件描述符中,并在rm中将新的文件描述符作为它的输入
修正后的程序:
$cat rm3.sh#! /bin/bashexec 3<&0while read fileinfodo   rm -iv $fileinfo <&3done< <( find . -type f -print )


 
 
顺带一提:
'done< <( find . -type f -print )'有两个‘<’的原因:
第一步:‘<( find . -type f -print )’相当于将子shell中的结果输出到一个临时文件
第二步:‘done< temp_file’从临时文件中获取输入



原标题:遇到shell重定向的一个奇怪问题:消失的标准输入!

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

fba怎么清库存:https://www.goluckyvip.com/tag/20290.html
fba怎么收仓储费:https://www.goluckyvip.com/tag/20291.html
fba怎么收费:https://www.goluckyvip.com/tag/20292.html
fba怎么收费的:https://www.goluckyvip.com/tag/20293.html
fba怎么算:https://www.goluckyvip.com/tag/20294.html
fba怎么算运费:https://www.goluckyvip.com/tag/20295.html
独家丨B站广告位可跳转美团APP B站为电商平台引流再升级 :https://www.kjdsnews.com/a/1836410.html
百崖大峡谷生态旅游景区(探秘中国西南自然风光):https://www.vstour.cn/a/363176.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流