我正在尝试显示包含以下内容的文件
!#abc
我试过这样
grep -l '!#abc'
但它不起作用。为什么?
另外,当我尝试类似的事情时
echo "#!a"
它检索
echo "#alias".
有人可以解释一下这里发生了什么吗? #! 是什么意思?实际上代表?
答案1
你必须写
grep \\!\\#abc <file>
你基本上必须转义 the#
和 the !
,这两个字符在几乎任何 shell 中都有特殊含义,请阅读 shell 手册以了解有关它们的更多信息。
答案2
好吧, grep:grep -l '!#abc'
还需要一个要处理的文件列表:
grep -l '!#abc' ./*
适用于当前目录中的所有文件。
echo:echo "#!a"
需要多一点引用,例如:
$ echo '#!a'
#!a
$ echo '#'\!'a'
#!a
$ echo '#'\!a
#!a
$ echo "#!"a
#!a
$ echo "#"'!a'
#!a
$ echo $'#!a'
#!a
'#' 是注释字符。从LESS=+'/^ *COMMENTS' man bash
:
评论
In a non-interactive shell, or an interactive shell in which the interactive_comments option to the shopt builtin is enabled (see SHELL BUILTIN COMMANDS below), a word beginning with # causes that word and all remaining characters on that line to be ignored. An interactive shell without the interactive_comments option enabled does not allow comments. The interactive_comments option is on by default in interactive shells.
它后面的任何内容都被视为“评论”并且不会被处理,例如:
$ echo one # two three
one
如果你想避免它的影响,你需要引用它,或者将它放在其他一些非空白字符之后:
$ echo one t# wo three
one t# wo three
是!
历史上的“关键人物”。
只是冰山一角:来自LESS=+'/^ *HISTORY EXPANSION' man bash
:
历史扩展
历史扩展是通过历史扩展角色的出现来引入的,它是!默认情况下。只有反斜杠 () 和单引号可以引用历史扩展字符,但如果历史扩展字符紧邻双引号字符串中的结束双引号之前,也将被视为带引号。
所以,对于你的最后一个问题:What does #! in fact represent?
。
答案是It depends.
也取决于周围的人物。
取决于是否被引用(以及如何引用)。并取决于它是否有前面的空格和/或尾随的空格。
如果引用正确,则只是相同的字符。如果没有用前导空格引用:注释。如果不加引号,则没有前导空格,没有尾随空格:历史扩展。
如果不加引号,则无前导空格,有尾随空格:字符。
当然,这是假设选项
shopt -p interactive_comments
shopt -po history
两样都定了。每个控制交互式 shell 中的相应字符 (#
和)。!
在非交互式 shell 中,始终强制执行注释字符,并且几乎始终不激活历史扩展。