Bash OS X上脚本和命令行之间的空文件grep-v-f不同

Bash OS X上脚本和命令行之间的空文件grep-v-f不同,bash,macos,bsd,Bash,Macos,Bsd,在bash中,在Mac上的终端中,而不是在Linux中,grep-v-f的行为不同,这取决于它是在命令行还是在脚本中执行。从命令行: $ touch empty-file #create an empty file $ printf 'foo' | grep -v -f empty-file foo 这是意料之中的事。但是,当该行在脚本中时,它不会输出任何内容。以下是脚本: $ cat grep-v-in-script.sh #!/usr/bin/env bash printf 'foo\

在bash中,在Mac上的终端中,而不是在Linux中,grep-v-f的行为不同,这取决于它是在命令行还是在脚本中执行。从命令行:

$ touch empty-file  #create an empty file
$ printf 'foo' | grep -v -f empty-file
foo
这是意料之中的事。但是,当该行在脚本中时,它不会输出任何内容。以下是脚本:

$ cat grep-v-in-script.sh 
#!/usr/bin/env bash
printf 'foo\n' | grep -v -f empty-file
printf 'end of script\n'
当我执行该脚本时:

$ ./grep-v-in-script.sh 
end of script
如果我在Linux中运行相同的脚本,它将按预期工作:

herdrick@some-linux-server:~$ ./grep-v-in-script.sh 
foo
end of script
如果我把'grep-v-f'改为'grep-f',那么它也不会输出任何东西,但这次是预期的

以下是我的bash版本:

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

问题仅仅是GNU grep和BSD grep之间的不兼容。请看@that other guy在帖子上的评论


我的困惑是因为我的别名设置为使用GNU grep。否则,在命令行中执行此操作与在脚本中执行此操作没有区别

您确定第二个示例中的空文件实际上是空的吗?你的行为让我怀疑它是否包含换行符。你是怎么制作的?ls-l报告它的大小是什么?printf'foo'| grep-v-f空文件使用BSD grep 2.5.1不生成输出;您使用的是什么版本的grep?这与bash没有任何关系。我无法重现您显示的终端输出。我用的是High Sierra,我可以用grep BSD grep 2.5.1-FreeBSD在莫哈韦复制它。我看到GNU grep-f@cody在所有情况下都使用了touch empty file来创建该文件。ls-al空文件显示它有0个字节。