我在 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,什么都没有发生,终端锁定。
为什么?我究竟做错了什么?
我无法在我的环境(RHEL)中重新创建它——CTRL-C 对我来说很好。在您的终端锁定后,我会打开一个新终端并使用它strace -p
来查看发生了什么。
不过,我认为命令设置通常存在一些问题。
首先是你cat
在子shell中做背景。 这样做会stdin
生成cat
command/dev/null
,而不是nc
您要通过管道传输到 subshell 的输出。您可以通过比较以下输出来查看差异:
#! /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 中运行来看到这一点。
希望这可以帮助。
我怀疑sudo。您是否尝试过从脚本中删除 sudo 并 sudo 整个脚本?
您是否尝试过 ctrl-Z 和 ps a 来查看是什么阻碍了它?