2016-09-26 79 views
0

grep -1給出錯誤,因爲它應該。但是grep -1凍結,但它應該報告無效標誌

$ touch foo 
$ grep -1 foo 

凍結。它不報告無效標誌。這是爲什麼發生?這是一個錯誤嗎?

我已經在Mac(El Capitan)和Ubuntu(14.04)上對它進行了測試。

+1

至於 「理所應當」 - 不是由POSIX指定的選項是*未指定的行爲*。根據定義,在這種情況下沒有指定正確的輸出/行爲。 –

回答

3

對於現代GNU和MacOS BSD實現,grep -1 foo正在從stdin中讀取數據,過濾包含foo的行的文件 - 這被解釋爲模式,而不是文件名。這與grep foo不同,因爲將每個匹配周圍的上下文數量設置爲單行,因此相當於grep -C1 foo


讀源GNU grep的,它明確地允許數作爲短選項:

static char const short_options[] = 
"A:B:C:D:EFGHIPTUVX:abcd:e:f:hiLlm:noqRrsuvwxyZz"; 

這些都存儲在DEFAULT_CONTEXT,確定上下文的多少行打印圍繞每個匹配,除非與重寫更明確的-A-B(指示匹配之前要打印多少行)。這與-C設置的值相同。

因此,在GNU實施和BSD實現延長其性能類似於它,

grep -C3 foo 

...和...

grep -3 foo 

...的行爲相同,打印3圍繞每場比賽的背景線。


來演示此行爲:

$ printf '%s\n' 3 2 1 foo 1 2 3 | grep -0 foo 
foo 

$ printf '%s\n' 3 2 1 foo 1 2 3 | grep -1 foo 
1 
foo 
1 

$ printf '%s\n' 3 2 1 foo 1 2 3 | grep -2 foo 
2 
1 
foo 
2 
1