【问题标题】:What happens when the command 'git grep grep' is executed?执行命令“git grep grep”时会发生什么?
【发布时间】:2019-09-27 13:40:58
【问题描述】:

我昨天在 linux 终端中使用 grep 来查找使用 'grep' 函数的 Perl 代码实例。我忘了在“grep”这个词周围加上引号,并注意到一些半有趣的东西。例如:

git grep grep

...而不是:

git grep 'grep'

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

有人可以向我解释一下为什么这个命令会导致终端挂起,但 git grep 本身不会,而是会为“没有给出模式”抛出一个致命错误?

【问题讨论】:

  • 无法重现git grep grepgit grep 'grep' 行为不同的任何情况。此外,在问题中,您引入了第三个命令 (git grep),它的行为当然不同,因为您没有告诉它要查找什么
  • 你用什么外壳?大多数 shell 删除了引号,所以 git grep 得到的参数是一样的。
  • ps -p $$ 命令给出以下输出:PID TTY TIME CMD 30386 pts/1 00:00:00 bash

标签: linux git grep


【解决方案1】:

在任何标准 shell 中引用 arg 都不可能改变任何东西。如果这两个命令的行为不同,您将面临硬件(或者,如果您的磁盘或系统是远程的,网络)困难

Shell 使用您的命令行为 execve 系统调用构造 args,在最简单的情况下,例如您的,命令的第一个单词用于搜索要执行的程序,命令行上的每个字符串都是作为参数传递。命令行中的引号用于关闭 shell 的一些预处理,这些引号不会传递给调用的命令——单字 arg 不需要预处理。所以git grep grepgit grep 'grep' 产生相同的git 调用。

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

git init --template=''

是初始化无模板最小 repo 的公认方式,但如果你记得我说过这些引号没有传递给启动的命令,你就会明白上面的内容与

git init --template=

如果你的幽默感在起作用,你会喜欢

git init '--'template=

这也是相同的,因为引号只是关闭了许多不会影响引用文本的预处理。如果你的 shell 的 bashman bash 并寻找 shell 扩展。

【讨论】:

  • 我认为这是正确的答案。我将假设这是一个网络问题,因为今天早上在我的服务器上执行 git grep grep 会产生与 git grep 'grep' 相同的结果,我应该注意,由于某种原因,当我昨天尝试此操作时,git grep 'grep' 给出了输出,而 @ 987654334@ 挂了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多