昨天我在Linux终端中使用grep查找使用了'grep'函数的Perl代码实例。我忘了在'grep'一词周围加上引号,并注意到有些有趣的地方。例如:
git grep grep
...而不是:
git grep 'grep'
...将导致终端挂起。为了满足自己的好奇心,我试图准确地研究执行此命令时幕后发生的一切,但是没有运气。
有人可以向我解释为什么这个命令会导致终端挂起,但是git grep
本身却没有,而是为“未提供模式”引发了致命错误?
答案 0 :(得分:1)
没有任何可能引用任何标准shell中的arg进行任何更改。如果两个命令的行为不同,则说明您遇到了硬件问题(或者,如果磁盘或系统位于远程,则面临网络问题)
Shell使用命令行在execve
系统调用中构造args,在最简单的情况下(如您的情况),命令的第一个单词用于查找要执行的程序,命令中的每个字符串行作为参数传递。命令行中的引号用于关闭外壳程序的某些预处理,这些引号不会传递给调用的命令-且一字arg不需要进行任何预处理。因此git grep grep
和git grep 'grep'
产生相同的git
调用。
在很多情况下,引号是为了人类利益,而没有任何实际效果。新手有时会因shell代码中是否包含引号而感到困惑,这是因为他们希望引号具有比其更大的意义,他们忘记了shell的主要工作是使用一堆字符串和标准文件来调用execve
都指向正确的地方。
git init --template=''
是初始化无模板最小存储库的公认方法,但是如果您还记得我说过这些引号未传递给启动的命令,您将理解上面的内容与
相同。git init --template=
如果您的幽默感发挥作用,您会喜欢的
git init '--'template=
也是相同的,因为引号只是关闭了很多预处理,而这些预处理无论如何都不会影响该引用的文本。如果您的shell的bash
说man bash
并寻找shell扩展。