打破无限循环

时间:2013-03-19 11:59:33

标签: bash loops cat

我在bash中运行此查询:

mkfifo resp
while true; do 
    sudo nc -l -p 80 < resp |
    (cat & echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp) ||
    break; 
done

然而,当我 Ctrl + C 时,没有任何反应,终端锁定。

为什么呢?我做错了什么?

2 个答案:

答案 0 :(得分:2)

我无法在我的环境中重新创建这个(RHEL) - CTRL-C对我来说很好。终端锁定后,我会打开一个新终端并使用strace -p查看正在发生的事情。

我认为一般来说命令设置存在一些问题。

首先,你在子shell中加载catDoing this makes the stdin of the cat command /dev/null,而不是你在子shell中输入的nc的输出。你可以通过比较它的输出来看出差异:

#! /bin/bash
# doesn't print yay
while true; do
    echo yay |
    (cat & false) ||
    break
done

用这个:

#! /bin/bash
# does print yay
while true; do
    echo yay |
    (cat ; false) ||
    break
done

另外,我不清楚这是否是故意的,但是你的循环的中断条件通常是基于子shell的退出代码,而后者又是{{1}的退出代码},这将永远成功,所以循环一般是无限的。您可以通过使用echo

替换上述某个内容中的false来查看此内容
echo

而且,正如@chepner指出的那样,您对#! /bin/bash while true; do echo yay | (cat & echo test) || break done 的使用一般也是错误的。根据其联机帮助页:

nc

这实际上导致你的-l Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the -p, -s, or -z options. 命令什么都不做(没有输出,只是坐在那里)。您可以通过在一个shell中以root身份运行nc,然后在另一个shell中以root身份运行mkfifo resp ; nc -l -p 80 < resp来查看此内容。

希望这有帮助。

答案 1 :(得分:0)

我怀疑是sudo。您是否尝试从脚本中删除sudo并对整个脚本进行sudo?

您是否尝试过ctrl-Z和ps a来查看它是什么?