2017-07-19 63 views
1

任何人都可以提供任何有關以下問題的可能原因的信息。大多數時候我可以運行(set -o pipefail; ldd --version | head -n 1; echo $?)並獲得以下內容。管道故障的好奇案例

$ (set -o pipefail; ldd --version | head -n 1; echo $?) 
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23 
0 

但隨後隨機將開始失敗

$ (set -o pipefail; ldd --version | head -n 1; echo $?) 
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23 
141 

因爲我已經看到了這個東西它的價值在Ubuntu 16.04 x86_64的,也對RHEL 7.3 ppc64le機

+0

我*確定*這是已經在知識庫中的東西的副本;只需要找到它... –

+1

啊,[bash zcat頭導致pipefail?](https://stackoverflow.com/questions/41516177/bash-zcat-head-causes-pipefail) –

回答

1

141EINIT。即過程中斷。

發生什麼事head -1在讀完第一行後關閉輸入流。當ldd嘗試寫入封閉的管道時,它將以EINIT失敗。

通常情況下,你看不到這個 - 程序在head採取了想要的操作後會退出並顯示錯誤消息,但是你看不到錯誤結果。但是因爲你有set -o pipefail,你會看到錯誤。

這是間歇性的,因爲管道中存在緩衝區,並且調度是不可預知的。 head關閉管道之前有時ldd已完成寫入。

您可以始終看到失敗,如果你這樣做ldd | echo(因爲馬上附和關閉標準輸入),你可以一直看到它與ldd | cat成功(因爲cat總是消耗直到EOF)。