我有一个bash脚本,它将维基百科URL作为参数(wiki_txt_script.sh),并使用wget从页面中获取文本。当使用-r选项调用时,它会提示用户是否需要文本中链接的任何页面中的文本,将所选URL放入临时文件中,每行一个URL。我已经创建了一个循环,以递归方式调用每个URL上的脚本,以便从这些页面获取文本:
while read line; do
echo $line
wiki_txt_script.sh -w $line
echo finished a recursive call
done <temp_links.txt
然而这似乎只循环一次,从temp_links.txt中的第一个URL成功获取文本(并且在递归调用后仍在循环中执行echo命令),但循环结束,而不是调用另一个temp_links.txt的行。从循环中删除递归调用会导致循环遍历每一行并按预期回显内容。 当递归调用出现时,是什么导致循环提前结束?
编辑: 查尔斯的回答解决了我的问题。然而,在使用带dev / null的脚本之后,到终端的每行输出都是在终端的最后一行输出结束时开始的。一旦脚本完成,它就会继续使用其他命令,并且如下所示:
Strange command line appearance
一旦我开始新的会话,这将会消失。有关为何发生这种情况的任何想法?
答案 0 :(得分:0)
这与递归没有任何关系。如果你的代码是递归的,你将会有一个无限循环,第一行temp_links.txt
被反复写入。
当一条线存在时,while read
循环提前终止的明显原因是该行消耗所有stdin ,不会为下一个read
调用留下任何内容。
要避免这种情况,请重定向命令的stdin,否则会导致此错误:
wiki_txt_script.sh -w "$line" </dev/null
...或者使用非stdin文件描述符进行读取:
while read line <&3; do
...
done 3< temp_links.sh