执行命令“ git grep grep”会发生什么?

时间:2019-09-27 13:40:58

标签: linux git grep

昨天我在Linux终端中使用grep查找使用了'grep'函数的Perl代码实例。我忘了在'grep'一词周围加上引号,并注意到有些有趣的地方。例如:

git grep grep

...而不是:

git grep 'grep'

...将导致终端挂起。为了满足自己的好奇心,我试图准确地研究执行此命令时幕后发生的一切,但是没有运气。

有人可以向我解释为什么这个命令会导致终端挂起,但是git grep本身却没有,而是为“未提供模式”引发了致命错误?

1 个答案:

答案 0 :(得分:1)

没有任何可能引用任何标准shell中的arg进行任何更改。如果两个命令的行为不同,则说明您遇到了硬件问题(或者,如果磁盘或系统位于远程,则面临网络问题)

Shell使用命令行在execve系统调用中构造args,在最简单的情况下(如您的情况),命令的第一个单词用于查找要执行的程序,命令中的每个字符串行作为参数传递。命令行中的引号用于关闭外壳程序的某些预处理,这些引号不会传递给调用的命令-且一字arg不需要进行任何预处理。因此git grep grepgit grep 'grep'产生相同的git调用。

在很多情况下,引号是为了人类利益,而没有任何实际效果。新手有时会因shell代码中是否包含引号而感到困惑,这是因为他们希望引号具有比其更大的意义,他们忘记了shell的主要工作是使用一堆字符串和标准文件来调用execve都指向正确的地方。

git init --template=''

是初始化无模板最小存储库的公认方法,但是如果您还记得我说过这些引号未传递给启动的命令,您将理解上面的内容与

相同。
git init --template=

如果您的幽默感发挥作用,您会喜欢的

git init '--'template=

也是相同的,因为引号只是关闭了很多预处理,而这些预处理无论如何都不会影响该引用的文本。如果您的shell的bashman bash并寻找shell扩展。