![grep 減號不起作用](https://rvso.com/image/1568345/grep%20%E6%B8%9B%E8%99%9F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我想找到包含-2
.
使用ls | grep "-2"
退貨usage: grep...
使用單引號而不是雙引號會傳回相同的結果,並且完全不使用引號,而搜尋其他任何內容都會正確傳回符合的檔案名稱。
我記得-
這不是正規表示式特殊字元。
請不要關注查找具有名稱的文件的特定問題。我主要想了解為什麼 grep 會這樣。
在 macOS 10.13 上使用 bash
答案1
就像它將 -2 解釋為命令列參數一樣,無論它是否用引號引起來。
grep
不知道參數是否用引號引起來。
許多解析步驟是由 shell 本身在執行任何操作之前執行的-應用>
重定向、$
擴展變數、*
擴展通配符、|
將管道拆分為一組單獨的命令,並將每個命令拆分為一個單字數組。
因此,無論您運行grep -2
、grep '-2'
、grep \-2
,甚至x=-2; grep $x
,shell 仍然會將其視為相同的參數清單:{ grep
, -2
}。這是將傳遞給 execv() 系統呼叫的內容,也是grep程式將在其argv[]
數組中接收,無論原始引用如何。
1即使在 Windows 上,CreateProcess() 中的命令列只是一個字串,大多數連接埠grep仍然會有這種行為,因為 C 運行時庫在初始化期間執行相同的參數分割。