2013-03-19 231 views
5

打破我在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

不確定它是否相關,但是您需要用反斜槓結束循環體的前兩行,或將管道或操作符移動到上一行的末尾。目前,你有3個獨立的新行終止的命令,而不是一個包含管道和'break'命令的列表。 – chepner 2013-03-19 12:17:30

+0

'nc'可以使用'-l'或'-p',但不能同時使用。你能描述一下這個程序應該做什麼嗎? – chepner 2013-03-19 12:24:21

+0

@chepner這完全取決於nc/netcat(BSD vs. linux)的風格。相反,經常需要 – sehe 2013-03-19 12:29:59

回答

2

我不能在我的環境(RHEL)中重新創建這個 - CTRL-C對此很好。你的終端鎖定後,我會打開一個新的,並使用strace -p來查看發生了什麼。

雖然我認爲一般的命令設置有一些問題。

首先是你在子框架中背景catDoing 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來查看。

希望這會有所幫助。

+0

@Mat木匠我批准你的編輯:) – 2013-03-20 13:58:46

+0

呵呵,我同意你的答案。顯然你對於細節的關注感到非常自豪,我尊重這一點。我剛剛花了最後的20分鐘玩了你給我關於bash的頓悟。 http://pastebin.com/fntNgc1T – 2013-03-20 14:04:30

0

我懷疑sudo。你有沒有嘗試從腳本中刪除sudo,並sudoing整個腳本?

你試過ctrl-Z和ps a來看看是什麼把它撐起來了嗎?