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 终端都尝试过,但行为相同。
谢谢
当你遇到这样的问题时,你应该开始从测试中删除一些东西,直到你得到一些有效的东西。
例如,如果您的起点是:
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 +H
和set -m
。