打破我在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,沒有任何反應,並且終端鎖起來。
爲什麼?我究竟做錯了什麼?
打破我在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
。 Doing this makes the stdin
of the cat
command /dev/null
,而不是輸出到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的退出碼,而後者將是echo
的退出代碼,它將始終成功,所以循環通常是無限的。您可以在上面的一個具有echo
更換false
看到這一點:
#! /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
命令做什麼都沒有(沒有輸出,只是坐在那裏)。您可以通過在一個shell中以根用戶身份運行mkfifo resp ; nc -l -p 80 < resp
,然後在另一個shell中以根用戶身份運行echo -e "HTTP/1.1 200 OK\r\n\r\nhello :)" > resp
來查看。
希望這會有所幫助。
@Mat木匠我批准你的編輯:) – 2013-03-20 13:58:46
呵呵,我同意你的答案。顯然你對於細節的關注感到非常自豪,我尊重這一點。我剛剛花了最後的20分鐘玩了你給我關於bash的頓悟。 http://pastebin.com/fntNgc1T – 2013-03-20 14:04:30
我懷疑sudo。你有沒有嘗試從腳本中刪除sudo,並sudoing整個腳本?
你試過ctrl-Z和ps a來看看是什麼把它撐起來了嗎?
不確定它是否相關,但是您需要用反斜槓結束循環體的前兩行,或將管道或操作符移動到上一行的末尾。目前,你有3個獨立的新行終止的命令,而不是一個包含管道和'break'命令的列表。 – chepner 2013-03-19 12:17:30
'nc'可以使用'-l'或'-p',但不能同時使用。你能描述一下這個程序應該做什麼嗎? – chepner 2013-03-19 12:24:21
@chepner這完全取決於nc/netcat(BSD vs. linux)的風格。相反,經常需要 – sehe 2013-03-19 12:29:59