Tentei criar um script echo
inserindo o conteúdo em um arquivo, em vez de abri-lo com um editor
echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command
A saída :
bash:! / bin / bash: evento não encontrado
Eu isolei esse comportamento estranho ao estrondo .
$ echo !
!
$ echo "!"
bash: !: event not found
$ echo \#!
#!
$ echo \#!/bin/bash
bash: !/bin/bash: event not found
- Por que o bang está causando isso?
- Quais são esses "eventos" aos quais o bash se refere?
- Como superar esse problema e imprimir "#! / Bin / bash" na tela ou no meu arquivo?
command-line
bash
echo
Stefan
fonte
fonte
$''
. Por exemplo,echo $'1!\n2!\n3!\n'
imprime cada número seguido por um estrondo e uma nova linha.echo '0123'"$var"'456'
observe dois pares de aspas simples e um par de aspas duplas.Como Richm disse , o bash está tentando fazer uma correspondência histórica . Outra maneira de evitá-lo é simplesmente escapar do estrondo com um
\
:Embora esteja ciente de que, entre aspas duplas, o
\
não é removido:fonte
"\!"
na verdade se expande para\!
, não!
, supostamente para conformidade com POSIX.!
aspas duplas sem comportamento mágico? Isso é loucura ...!
inicia uma substituição do histórico (um "evento" é uma linha no histórico de comandos); por exemplo,!ls
expande para a última linha de comando que contémls
e!?foo
expande para a última linha de comando que contémfoo
. Você também pode extrair palavras específicas (por exemplo,!!:1
refere-se à primeira palavra do comando anterior) e muito mais; veja o manual para detalhes.Esse recurso foi inventado para recuperar rapidamente comandos anteriores nos dias em que a edição da linha de comandos era primitiva. Com shells modernos (pelo menos bash e zsh) e copiar e colar, a expansão do histórico não é tão útil quanto costumava ser - ainda é útil, mas você pode sobreviver sem ele.
Você pode alterar qual caractere aciona a substituição do histórico configurando a
histchars
variável; se você raramente usa a substituição do histórico, pode definir, por exemplo,histchars='¡^'
para que¡
desencadeie a expansão do histórico em vez de!
. Você pode até desativar o recurso completamenteset +o histexpand
.fonte
Para poder desativar a expansão do histórico em uma linha de comando específica, você pode usar
space
como o terceiro caractere de$histchars
:Então, se você digitar seu comando com um espaço à esquerda, a expansão do histórico não será executada.
Observe, no entanto, que os espaços à esquerda também são usados quando
$HISTCONTROL
contémignorespace
como uma maneira de informarbash
para não registrar uma linha de comando no histórico.Se você deseja que ambos os recursos sejam independentes, precisará escolher outro caractere como o terceiro caractere
$histchars
. Você quer um que não afete a maneira como seu comando é interpretado. Algumas opções:\
):\echo foo
funciona, mas tem o efeito colateral de desativar aliases ou palavras-chave.Se você não se importa digitando duas chaves, você pode escolher qualquer personagem que normalmente não aparecer na primeira posição (
%
,@
,?
, escolher o seu próprio) e fazer um alias vazio para ele:Em seguida, insira esse caractere, espaço e seu comando:
(você não poderá não gravar um comando em que a substituição do histórico tenha sido desativada. Observe também que o terceiro caractere padrão
$histchars
é#
para que a expansão do histórico não seja feita nos comentários. Se você o alterar e inserir comentários no prompt, você deve estar ciente do fato de que as sequências! podem ser expandidas lá).fonte
As soluções propostas não funcionam, por exemplo, no seguinte exemplo:
Nesse caso, o estrondo pode ser impresso usando seu código ASCII octal:
fonte
!
entre aspas duplas, onde outras respostas indicam, mantém o significado da expansão do histórico. Você poderia usarbash -c 'echo '\''hello World!'\'
oubash -c "echo 'hello World"\!"'"
.Desde o Bash 4.3, agora você pode usar aspas duplas para citar o caractere de expansão do histórico:
fonte
!
seguido apenas por"
isso não é mais especial.echo "foo!"
é OK,echo "foo!bar"
não é