我的终端有一个奇怪的行为。
以下命令不会在我的终端上打印任何内容:
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 +H
和set -m
。