【发布时间】:2019-02-12 21:29:37
【问题描述】:
在 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”,则在我的 Mac 上进行 FWIW,然后它再次不输出任何内容,但这次是预期的。
这是我的 bash 版本:
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
【问题讨论】:
-
您确定第二个示例中的
empty-file实际上是空的吗?您显示的行为让我想知道它是否包含换行符。你是怎么制作的?ls -l报告它的大小是什么? -
printf 'foo' | grep -v -f empty-file使用 BSDgrep2.5.1 不产生输出;你使用的是什么版本的grep? (这实际上与bash没有任何关系。) -
我无法重现您显示的终端输出。我正在使用 High Sierra。
-
我可以使用“grep (BSD grep) 2.5.1-FreeBSD”在 Mojave 上重现它。我看到 GNU
grep -f <(:)立即退出失败,而 GNUgrep -f <(:) -v等待并匹配所有。同时,macOSgrep在这两种情况下都会立即退出并失败。 POSIX 说-f将“从文件中读取一个或多个模式”,并且没有解决零行的问题 -
@cody 在所有情况下我都使用
touch empty-file创建该文件。ls -al empty-file显示它有 0 个字节。