grep 在 Fedora 和 Ubuntu 上的表现不同

Gre*_*Ant 13 ubuntu bash fedora grep

所以当我在 Fedora 中运行它时,我看到了这个:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
2R-ref.alleles
Run Code Online (Sandbox Code Playgroud)

但是当我在 Ubuntu(相同数据)上运行时,我没有从 grep 中得到任何结果:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
Run Code Online (Sandbox Code Playgroud)

任何想法可能会发生什么?我怎样才能想出在两个系统上都能正常工作的东西?

小智 30

grep -F '-ref.alleles'
Run Code Online (Sandbox Code Playgroud)

相当于:

grep -F -ref.alleles
Run Code Online (Sandbox Code Playgroud)

(撇号之间的字符都不是 shell 元字符,因此引用它们无效。)

这又相当于:

grep -F -r -e f.alleles
Run Code Online (Sandbox Code Playgroud)

通过-前缀选项的正常解析。该-e选项需要一个说法,但-F-r没有。

由于您没有为 grep 指定任何文件,因此默认行为是对标准输入进行操作...除了该-r选项没有意义,因此它默认为.递归搜索(当前目录)并忽略标准输入。在某些版本中。

你需要使用--一个正则表达式之前,“没有更多的选择”的指标,开始与-作为

grep -F -- -ref.alleles
Run Code Online (Sandbox Code Playgroud)

我追踪了-r没有文件参数的行为改变的点。它的版本为 2.11,于 2012 年 3 月 2 日发布。请参阅发布公告。

影响行为的 git 提交是this onethis one

如果你grep --version在你的两台机器上运行,我相信你会发现其中一台在 2.11 的错误一侧

  • 哇谢谢。你是对的,我有 grep 2.6.3 和 grep 2.14。 (2认同)

Cyr*_*rus 6

领先-是问题。要获得相同的结果,请添加--

grep -F -- '-ref.alleles'
Run Code Online (Sandbox Code Playgroud)

来自man bash

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.
Run Code Online (Sandbox Code Playgroud)

  • bash 手册页并不真正相关。它解释了 bash 自己的命令行上对 `--` 的处理,它独立于 grep 对 `--` 的理解。它们以相同的方式工作,因为这是一个常见的约定,但通常您的 shell 手册页不会告诉您任何有关其他程序参数含义的信息。 (4认同)