因此,当我在 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
但是当我在 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'
有什么想法可能发生了什么吗?我怎样才能想出在两个系统上都能正常工作的方法?
答案1
grep -F '-ref.alleles'
相当于:
grep -F -ref.alleles
(撇号之间的字符都不是 shell 元字符,因此引用它们没有任何效果。)
这又相当于:
grep -F -r -e f.alleles
-
通过对前缀选项进行正常解析。-e
选项带有参数,但-F
和-r
不带有参数。
由于您没有为 grep 指定任何文件,因此默认行为是对 stdin 执行操作...除非该-r
选项没有意义,因此它默认为.
递归搜索(当前目录)并忽略 stdin。在某些版本中。
您需要在以 as开头的正则表达式之前使用--
“没有更多选项”指示符-
grep -F -- -ref.alleles
我找到了没有文件参数的行为发生变化的点-r
。那是在 2012 年 3 月 2 日发布的 2.11 版本中。参见发布公告。
如果你grep --version
在两台机器上运行,我确信你会发现其中一台机器运行的是 2.11 的错误版本
答案2
领先-
是问题所在。要获得相同的结果,请添加--
:
grep -F -- '-ref.alleles'
从man bash
:
A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.
答案3
检查 .bashrc 中是否有任何 grep 命令的别名会覆盖其行为。也许这就是问题所在。也可以尝试不带“-F”参数的 grep。