grep 在 bash 脚本中工作,但在终端中不起作用

Geo*_*iou 0 grep bash terminal

我的终端中有一个奇怪的行为。

以下命令不会向我的终端打印任何内容:

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
Run Code Online (Sandbox Code Playgroud)

完全相同的命令,相同的语法在 bash 脚本中完美运行。

通常,我看到人们抱怨相反的行为。

我知道上述操作可以通过数百种方式完成,但我不明白为什么上述命令在我的终端中没有运行。

另一方面,这些命令在终端和脚本中都可以正常工作:

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop
Run Code Online (Sandbox Code Playgroud)

我在 Debian 8 Sid 下使用 GNU bash,版本 4.4.0(1)-release (x86_64-pc-linux-gnu),grep (GNU grep) 2.26。我在 xfce 和 mate 终端都尝试过,但行为相同。

谢谢

phe*_*mer 5

当你遇到这样的问题时,你应该开始从测试中删除一些东西,直到你得到一些有效的东西。

例如,如果您的起点是:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment
Run Code Online (Sandbox Code Playgroud)

首先剥离可变的东西:

cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
Run Code Online (Sandbox Code Playgroud)

然后剥离第二个grep

cat /usr/share/applications/brasero.desktop |grep '^Comment='
Run Code Online (Sandbox Code Playgroud)

然后另一个grep:

cat /usr/share/applications/brasero.desktop
Run Code Online (Sandbox Code Playgroud)

最终你会发现它开始工作的点。在您的特定情况下,它将开始使用:

cat /usr/share/applications/brasero.desktop |grep '^Comment='
Run Code Online (Sandbox Code Playgroud)

所以grep这是一个问题。添加其他东西,看看它是否仍然有效:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment
Run Code Online (Sandbox Code Playgroud)

确实如此。所以有什么问题?好吧,注意最后一个,输出是彩色的吗?输出中有 ANSI 颜色转义码。这阻止了第二个grep匹配。

解决方法是将您的grep别名更改为--color=auto、 或 do unalias grep,或者手动添加--color=never到命令中。


还有另一种方法可以用来解决这个问题。由于您知道它可以在脚本中工作,唯一的解释是它是环境的。

因此,您可以从一个干净的环境bash --noprofile --norc开始,然后开始逐个引入您的配置文件,直到它损坏为止。

不过,这项技术有一个问题。即使使用--noprofile --norc,CLI 和脚本之间也存在一些差异,例如历史扩展和作业控制。你也可以关闭这些:set +Hset -m