6

我在 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,什么都没有发生,终端锁定。

为什么?我究竟做错了什么?

4

2 回答 2

2

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

不过,我认为命令设置通常存在一些问题。

首先是你cat在子shell中做背景。 这样做会stdin生成catcommand/dev/null,而不是nc您要通过管道传输到 subshel​​l 的输出。您可以通过比较以下输出来查看差异:

#! /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的退出代码,而子shell的退出代码echo将始终成功,所以循环通常是无限的。您可以通过将false上述之一替换为echo

#! /bin/bash
while true; do
    echo yay |
    (cat & echo test) ||
    break
done

而且,正如@chepner 指出的那样,您的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.

这实际上导致您的nc命令什么都不做(没有输出,只是坐在那里)。您可以通过mkfifo resp ; nc -l -p 80 < resp以 root 身份在一个 shell 中运行,然后以 rootecho -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp身份在另一个 shell 中运行来看到这一点。

希望这可以帮助。

于 2013-03-19T18:02:47.207 回答
0

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

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

于 2013-03-19T16:59:16.090 回答