Bash

在 OSX 上使用 grep –exclude-dir

  • March 17, 2021

我正在嘗試查找包含文本“預設互動式外殼”的文件。我正在嘗試使用以下 grep 命令來查找它:

grep -r --exclude-dir='/{var,Volumes,bin,cores,dev,sbin,tmp,usr}' "The default interactive shell" /

但是它仍然搜尋/usr,如此錯誤消息所示:

grep: /usr/bin/sudo: Permission denied

如何在不編寫多個--exclude-dir選項的情況下執行遞歸 grep 並排除多個目錄?系統為 OSX 10.15.4。

您正在排除具有文字名稱的目錄/{var,Volumes,bin,cores,dev,sbin,tmp,usr}。這是由於單引號。當大括號展開被引用時,它不再是大括號展開,只是普通的文本。

要正確地讓大括號擴展展開,請刪除引號:

grep -R --exclude-dir=/{var,Volumes,bin,cores,dev,sbin,tmp,usr} \
   -F 'The default interactive shell' /

我還添加了-F因為您使用字元串而不是正則表達式進行搜尋。

我正在做同樣的事情……

當我在 OSX Big Sur 中的 bash 終端啟動時,它給出了這個消息……

“預設的互動式 shell 現在是 zsh。要更新您的帳戶以使用 zsh,請執行chsh -s /bin/zsh。有關更多詳細資訊,請訪問https://support.apple.com/kb/HT208050。”

所以我做了一個 grep 搜尋,尋找一個包含“預設互動式外殼”字樣的文件。我沒有找到這樣的文件。

事實證明,“預設互動式 shell 等”消息實際上是硬編碼到 bash 中的。

hexdump -C /bin/bash 產生…

000775c0 6e 2f 7a 73 68 00 0a 54 68 65 20 64 65 66 61 75 | n / zsh ..預設 |

000775d0 6c 74 20 69 6e 74 65 72 61 63 74 69 76 65 20 73 |lt 互動式 s|

000775e0 68 65 6c 6c 20 69 73 20 6e 6f 77 20 7a 73 68 2e |地獄現在是zsh。|

(注意:我的 $BASH_VERSION 是 3.2.57(1)-release)

(注意:有許多 ASCII 消息硬編碼到 bash 中。)

可以通過在 ~/.bash_profile 導出 BASH_SILENCE_DEPRECATION_WARNING=1 中添加以下行來消除此警告

伊恩·詹姆斯

引用自:https://unix.stackexchange.com/questions/581156