2014-01-28 85 views
2

我使用bash,據我所知,執行後面跟着一個命令是應該取代shell而不創建新進程。例如,Shell執行和管道

exec echo hello 

有印刷的「你好」的出現,然後立即離開,因爲回聲完成後,shell進程是不存在返回了。

如果我把這個作爲管道的一部分 - 例如,

exec echo hello | sed 's/hell/heck/' 

echo hello | exec sed 's/hell/heck/' 

我希望的是,同樣地,外殼將終止其進程之中的結果取而代之。然而,這並不是現實中發生的事情 - 上述命令都會打印出「hecko」並正常返回到shell,就好像「exec」這個詞不存在一樣。爲什麼是這樣?

回答

4

有句子的bash手冊中:

管道中的每個命令被作爲一個單獨的處理中執行(即,在 子shell)。

因此,在這兩個示例中,流水線首先產生兩個進程,'exec'在產生進程的一個內部執行 - 而不會影響執行管道的shell。

+0

沒錯。另一個不影響母shell的例子是使用圓括號創建一個子shell:'(exec echo hello)'。 – Alfe