0
grep -1
給出錯誤,因爲它應該。但是grep -1凍結,但它應該報告無效標誌
$ touch foo
$ grep -1 foo
凍結。它不報告無效標誌。這是爲什麼發生?這是一個錯誤嗎?
我已經在Mac(El Capitan)和Ubuntu(14.04)上對它進行了測試。
grep -1
給出錯誤,因爲它應該。但是grep -1凍結,但它應該報告無效標誌
$ touch foo
$ grep -1 foo
凍結。它不報告無效標誌。這是爲什麼發生?這是一個錯誤嗎?
我已經在Mac(El Capitan)和Ubuntu(14.04)上對它進行了測試。
對於現代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
至於 「理所應當」 - 不是由POSIX指定的選項是*未指定的行爲*。根據定義,在這種情況下沒有指定正確的輸出/行爲。 –