grep 在 bash 脚本中有效,但在终端中无效

grep 在 bash 脚本中有效,但在终端中无效

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

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

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

完全相同的命令、相同的语法在 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

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

谢谢

答案1

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

例如,如果您的起点是:

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

首先去掉变量的东西:

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

然后剥掉第​​二个grep

cat /usr/share/applications/brasero.desktop |grep '^Comment='

然后是另一个 grep:

cat /usr/share/applications/brasero.desktop

最终你会找到它开始工作的点。在您的特定情况下,它将开始使用以下内容:

cat /usr/share/applications/brasero.desktop |grep '^Comment='

所以这就是grep问题所在。添加其他东西回来看看它是否仍然有效:

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

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

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


还有另一种方法可以解决这个问题。既然您知道它是在脚本内工作的,那么唯一的解释就是它是环境性的。

因此,您可以从一个干净的环境开始,bash --noprofile --norc然后开始一点一点地引入您的配置文件,直到它崩溃。

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

相关内容