Bem, o grep: grep -l '!#abc'
também precisa de uma lista de arquivos para processar:
grep -l '!#abc' ./*
funciona em todos os arquivos no diretório atual.
O echo: echo "#!a"
precisa de um pouco mais de citações, como:
$ echo '#!a'
#!a
$ echo '#'\!'a'
#!a
$ echo '#'\!a
#!a
$ echo "#!"a
#!a
$ echo "#"'!a'
#!a
$ echo $'#!a'
#!a
O '#' é o caractere de comentário. De LESS=+'/^ *COMMENTS' man bash
:
COMMENTS
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.
Tudo o que se segue em uma linha é considerado 'um comentário' e não é processado, como:
$ echo one # two three
one
Se você quiser evitar o efeito, é necessário citá-lo ou colocá-lo logo depois de outro caractere que não esteja em branco:
$ echo one t# wo three
one t# wo three
O !
é o histórico "caractere chave".
Apenas a ponta do iceberg: De LESS=+'/^ *HISTORY EXPANSION' man bash
:
HISTORY EXPANSION
History expansions are introduced by the appearance of the history expansion character, which is ! by default. Only backslash () and single quotes can quote the history expansion character, but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.
Então, para sua última pergunta: What does #! in fact represent?
.
A resposta é It depends.
Depende dos personagens próximos também.
Depende se é citado (e como é citado) ou não.
E depende se tiver espaço em branco precedente e / ou espaço em branco à direita.
Se corretamente citado, apenas os mesmos caracteres.
Se não for citado com um espaço à esquerda: um comentário.
Se não for citado, nenhum espaço inicial, nenhum espaço à direita: uma expansão de histórico.
Se não for citado, não há espaço à esquerda, com um espaço à direita: os caracteres.
Isso, claro, está assumindo que as opções
shopt -p interactive_comments
shopt -po history
São ambos definidos. Cada um controla o respectivo caractere ( #
e !
) em shells interativos. Em shells não interativos, o caractere de comentário é sempre imposto e a expansão do histórico quase sempre não é ativada.