首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用BSD时--排除-dir "_book"`工作,但是

问为什么在使用BSD时--排除-dir "_book"`工作,但是
EN

Unix & Linux用户
提问于 2018-03-27 02:21:52
回答 1查看 468关注 0票数 -1

我的grep版本是grep (BSD grep) 2.5.1-FreeBSD,我的操作系统是OSX 10.13.3 (17D47)。

我有一个gitbook repo,并且有一个名为_book的临时目录,在使用grep时我想忽略它。

当我使用grep -Fnrl mysql ./ --exclude-dir={_book}时,它没有排除_book目录。结果就像

代码语言:javascript
复制
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh
.//_book/search_jieba_index.dat
.//_book/LANGUAGES/awk/awk_magic.html

但是命令grep -Fnrl mysql ./ --exclude-dir "_book"给了我我所期望的结果

代码语言:javascript
复制
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh

我已经搜索了堆栈溢出,并找到了一个问题,它提到了第一个命令样式,并获得了3次向上,所以我想它在某些情况下是有效的。

问题链接是:使用grep和--不包括标志排除多个目录。

为什么会发生这种情况?

如果我想使用第一个命令样式成功地排除_book,该怎么办?

EN

回答 1

Unix & Linux用户

发布于 2018-03-27 02:43:22

这些都不是不同的“命令样式”。他们使用的是bash特性,而不是grep特性。

通过运行来阅读它:

代码语言:javascript
复制
LESS='+/Brace Expansion' man bash

当大括号中有逗号分隔的值时,shell会在grep看到它们之前将它们展开为多个参数。

因为您只是在传递一个目录,所以不需要进行大括号扩展。

如果使用大括号之间只有一个项(没有逗号,也没有双句点来表示范围),则shell将大括号单独保留。留给grep的是文字名{_book},它不是要排除的目录。

值得一提的是,你也不需要双引号。

代码语言:javascript
复制
grep -Fnrl mysql ./ --exclude-dir _book

...will工作得很好。

双引号没有什么坏处,但它们也没有必要。您可以在所有参数上使用它们,结果是相同的,因为引用被shell删除--在grep看到它们之前。

代码语言:javascript
复制
grep '-Fnrl' "mysql" './' "--exclude-dir" \_\b\o\o\k

您甚至可以引用命令名本身'grep',尽管这有稍微不同的含义。具体来说,它取消了别名查找。例如,在Ubuntu系统上,grep通常被别名为grep --color=auto。引用"grep" (或其任何部分)将绕过这个别名。

代码语言:javascript
复制
gr\ep -Fnrl mysql ./ --exclude-dir _book

这个故事的寓意是,理解你所用的语言的引用规则。

或者你可以“犯”错误,结果令人困惑。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/433729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档