我在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 时,没有任何反应,终端锁定。
为什么呢?我做错了什么?
答案 0 :(得分:2)
我无法在我的环境中重新创建这个(RHEL) - CTRL-C对我来说很好。终端锁定后,我会打开一个新终端并使用strace -p
查看正在发生的事情。
我认为一般来说命令设置存在一些问题。
首先,你在子shell中加载cat
。 Doing 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来查看它是什么?