关于shell的一个问题求大神解决

PhpEr_贵 2014-12-09 10:38:30


#!/bin/bash
tmp_fifo="/tmp/$$.fifo"
mkfifo $tmp_fifo #创建管道描述符文件
exec 6<>$tmp_fifo
rm $tmp_fifo
file="/tmp/file.t" #假设这个文件有10来行 ,内容随意,正常就行
for((i=0;i<10;i++));do
echo 1
done>&6
while read line;do
for((i=0;i<6;i++));do
read -u6 k #这里文件描述符只有一个1了 程序处于挂起状态
echo k
done
done < $file #后面从定向

#将读取文件换成下面就可以取出6个1
while read line < $file
do
for((i=0;i<6;i++));do
read -u6 k #这里文件描述符只有一个1了 程序处于挂起状态
echo k
done
done


求解决。。。。要得发不离8 小弟就给个88分。。。。
...全文
193 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZG 2014-12-11
  • 打赏
  • 举报
回复
这个不太清楚了,觉得应该是版本的问题,记得双圆括号要求的版本比较高,不知道3.0的支持不
PhpEr_贵 2014-12-11
  • 打赏
  • 举报
回复
引用 4 楼 zgangz 的回复:
[quote=引用 3 楼 u010541899 的回复:]
[quote=引用 2 楼 zgangz 的回复:]
刚又看到这个问题,可能明白你要问的了

第一个while也是可能会挂起的,只要file的行数足够多,第二while一定会挂起

当file的行数少时,为什么第一个while不挂起,第二个会?因为对于第一个while,<$file是针对整个while循环,每次读file的一行,直到文件尾,对于第二个while,read line < $file,每次都是重新把file重定向给read,这里每次取的都是file的第一行,read line永远取得到数据,while永远不会结束,循环一直执行,直到管道中无数据,然后在read -u6 k 这一行挂起


亲 是的 echo $k 确实是一个错误
但是第一个while会挂起 而且只能输出一个 1 但是我开始是向管道符中输入了10个1的,而我的for循环只有到6,按道理说只要文件里的行数小于2程序就不会挂起,(读取文件一行输出6个1,有两行那么就得12个1,只有10个那么就会挂起) 但是无论如何最少输出6个1(文件中至少有一行数据),但是我在bash 3.0的环境下测试程序只输出一个1就开始挂起,这个就不懂了????

第二个while 肯定会挂起就是你说的那种,while始终为真。。。。


[/quote]

我刚才特意试了下,file只有一行时,输出了6个1,没挂起
GNU bash, version 4.3.8
[/quote]


GNU bash(bdsh), version 3.00.22(2)-release (x86_64-redhat-linux-gnu) bash 3.0还真会挂起。






看吧 有图有真相 难道是bash 版本的问题 难道是bash bug?
PhpEr_贵 2014-12-11
  • 打赏
  • 举报
回复
引用 8 楼 zgangz 的回复:
[quote=引用 7 楼 u010541899 的回复:] [quote=引用 6 楼 zgangz 的回复:] 这个不太清楚了,觉得应该是版本的问题,记得双圆括号要求的版本比较高,不知道3.0的支持不
好吧 不是圆括号的问题 先不管这个了吧 你知道 cur_time=$(date +%s) 和 cur_time=`date +%s`有区别么 就是获取命令执行后的结果放到变量里 那种写法好些[/quote] 没什么区别吧,我比较喜欢用后一种,后一种更直观 shell不用学得太深入,不要花太多时间,只能作为开发中的一个辅助工具而已,能用顺手就行了[/quote] 好吧thanks
ZG 2014-12-11
  • 打赏
  • 举报
回复
引用 7 楼 u010541899 的回复:
[quote=引用 6 楼 zgangz 的回复:] 这个不太清楚了,觉得应该是版本的问题,记得双圆括号要求的版本比较高,不知道3.0的支持不
好吧 不是圆括号的问题 先不管这个了吧 你知道 cur_time=$(date +%s) 和 cur_time=`date +%s`有区别么 就是获取命令执行后的结果放到变量里 那种写法好些[/quote] 没什么区别吧,我比较喜欢用后一种,后一种更直观 shell不用学得太深入,不要花太多时间,只能作为开发中的一个辅助工具而已,能用顺手就行了
PhpEr_贵 2014-12-11
  • 打赏
  • 举报
回复
引用 6 楼 zgangz 的回复:
这个不太清楚了,觉得应该是版本的问题,记得双圆括号要求的版本比较高,不知道3.0的支持不
好吧 不是圆括号的问题 先不管这个了吧 你知道 cur_time=$(date +%s) 和 cur_time=`date +%s`有区别么 就是获取命令执行后的结果放到变量里 那种写法好些
ZG 2014-12-09
  • 打赏
  • 举报
回复
刚又看到这个问题,可能明白你要问的了 第一个while也是可能会挂起的,只要file的行数足够多,第二while一定会挂起 当file的行数少时,为什么第一个while不挂起,第二个会?因为对于第一个while,<$file是针对整个while循环,每次读file的一行,直到文件尾,对于第二个while,read line < $file,每次都是重新把file重定向给read,这里每次取的都是file的第一行,read line永远取得到数据,while永远不会结束,循环一直执行,直到管道中无数据,然后在read -u6 k 这一行挂起
ZG 2014-12-09
  • 打赏
  • 举报
回复
1.指正一个错误read -u6 k echo k,这里需要改为echo $k 2.肯定会挂起。你这里创建了一个有名管道,然后向管道中写入了10行1,while循环中有一个for循环,第一次while循环就从管道中读6行,等第二次while读完10行后,由于管道中无数据,会等待,也就是你说的挂起
ZG 2014-12-09
  • 打赏
  • 举报
回复
引用 3 楼 u010541899 的回复:
[quote=引用 2 楼 zgangz 的回复:] 刚又看到这个问题,可能明白你要问的了 第一个while也是可能会挂起的,只要file的行数足够多,第二while一定会挂起 当file的行数少时,为什么第一个while不挂起,第二个会?因为对于第一个while,<$file是针对整个while循环,每次读file的一行,直到文件尾,对于第二个while,read line < $file,每次都是重新把file重定向给read,这里每次取的都是file的第一行,read line永远取得到数据,while永远不会结束,循环一直执行,直到管道中无数据,然后在read -u6 k 这一行挂起
亲 是的 echo $k 确实是一个错误 但是第一个while会挂起 而且只能输出一个 1 但是我开始是向管道符中输入了10个1的,而我的for循环只有到6,按道理说只要文件里的行数小于2程序就不会挂起,(读取文件一行输出6个1,有两行那么就得12个1,只有10个那么就会挂起) 但是无论如何最少输出6个1(文件中至少有一行数据),但是我在bash 3.0的环境下测试程序只输出一个1就开始挂起,这个就不懂了???? 第二个while 肯定会挂起就是你说的那种,while始终为真。。。。 [/quote] 我刚才特意试了下,file只有一行时,输出了6个1,没挂起 GNU bash, version 4.3.8
PhpEr_贵 2014-12-09
  • 打赏
  • 举报
回复
引用 2 楼 zgangz 的回复:
刚又看到这个问题,可能明白你要问的了 第一个while也是可能会挂起的,只要file的行数足够多,第二while一定会挂起 当file的行数少时,为什么第一个while不挂起,第二个会?因为对于第一个while,<$file是针对整个while循环,每次读file的一行,直到文件尾,对于第二个while,read line < $file,每次都是重新把file重定向给read,这里每次取的都是file的第一行,read line永远取得到数据,while永远不会结束,循环一直执行,直到管道中无数据,然后在read -u6 k 这一行挂起
亲 是的 echo $k 确实是一个错误 但是第一个while会挂起 而且只能输出一个 1 但是我开始是向管道符中输入了10个1的,而我的for循环只有到6,按道理说只要文件里的行数小于2程序就不会挂起,(读取文件一行输出6个1,有两行那么就得12个1,只有10个那么就会挂起) 但是无论如何最少输出6个1(文件中至少有一行数据),但是我在bash 3.0的环境下测试程序只输出一个1就开始挂起,这个就不懂了???? 第二个while 肯定会挂起就是你说的那种,while始终为真。。。。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧