【问题标题】:grep -v -f of empty file different between script and command line on OS XOS X上脚本和命令行之间的空文件的grep -v -f不同
【发布时间】: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 使用 BSD grep 2.5.1 不产生输出;你使用的是什么版本的grep? (这实际上与bash 没有任何关系。)
  • 我无法重现您显示的终端输出。我正在使用 High Sierra。
  • 我可以使用“grep (BSD grep) 2.5.1-FreeBSD”在 Mojave 上重现它。我看到 GNU grep -f <(:) 立即退出失败,而 GNU grep -f <(:) -v 等待并匹配所有。同时,macOS grep 在这两种情况下都会立即退出并失败。 POSIX 说-f 将“从文件中读取一个或多个模式”,并且没有解决零行的问题
  • @cody 在所有情况下我都使用touch empty-file 创建该文件。 ls -al empty-file 显示它有 0 个字节。

标签: bash macos bsd


【解决方案1】:

问题只是 GNU grep 和 BSD grep 之间的不兼容。请参阅@that-other-guy 对帖子的评论。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多