J'ai essayé de créer un script en echo
'insérant le contenu dans un fichier, au lieu de l'ouvrir avec un éditeur
echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command
La sortie :
bash:! / bin / bash: événement non trouvé
J'ai isolé ce comportement étrange au bang .
$ echo !
!
$ echo "!"
bash: !: event not found
$ echo \#!
#!
$ echo \#!/bin/bash
bash: !/bin/bash: event not found
- Pourquoi est-ce que bang est la cause?
- Quels sont ces "événements" auxquels bash fait référence?
- Comment résoudre ce problème et imprimer "#! / Bin / bash" à l'écran ou dans mon fichier?
command-line
bash
echo
Stefan
la source
la source
$''
. Par exemple,echo $'1!\n2!\n3!\n'
imprime chaque numéro suivi d'un bang et d'une nouvelle ligne.echo '0123'"$var"'456'
notez deux paires de guillemets simples et une paire de guillemets doubles.Comme Richm l'a dit , bash essaie de faire une correspondance d'histoire . Une autre façon de l'éviter est simplement d'échapper au bang avec un
\
:Attention, entre guillemets doubles, le
\
n'est pas supprimé:la source
"\!"
étend réellement à\!
, pas!
soi-disant pour la conformité POSIX.!
guillemets sans comportement magique? C'est fou ...!
commence une substitution d'historique (un «événement» est une ligne de l'historique des commandes); par exemple,!ls
étend jusqu'à la dernière ligne de commande contenantls
et!?foo
élargit jusqu'à la dernière ligne de commande contenantfoo
. Vous pouvez également extraire des mots spécifiques (par exemple,!!:1
fait référence au premier mot de la commande précédente) et plus encore; voir le manuel pour plus de détails.Cette fonctionnalité a été inventée pour rappeler rapidement les commandes précédentes à l’époque où l’édition en ligne de commande était primitive. Avec les shells modernes (au moins bash et zsh) et le copier-coller, le développement de l'historique n'est plus aussi utile qu'auparavant: il est toujours utile, mais vous pouvez vous en passer.
Vous pouvez changer le personnage qui déclenche la substitution d'historique en définissant la
histchars
variable. si vous utilisez rarement la substitution d'historique, vous pouvez définir, par exemplehistchars='¡^'
, le¡
déclenchement de l'expansion de l'historique au lieu de!
. Vous pouvez même désactiver complètement la fonctionnalité avecset +o histexpand
.la source
Pour pouvoir désactiver le développement de l'historique sur une ligne de commande particulière, vous pouvez utiliser
space
le 3ème caractère de$histchars
:Ensuite, si vous entrez votre commande avec un espace de début, l'expansion de l'historique ne sera pas effectuée.
Notez cependant que les espaces de début sont également utilisés quand
$HISTCONTROL
contient contientignorespace
comme un moyen debash
ne pas enregistrer une ligne de commande dans l'historique.Si vous souhaitez que les deux fonctionnalités soient indépendantes, vous devez choisir un autre caractère en tant que 3ème caractère de
$histchars
. Vous en voulez un qui n'affecte pas la façon dont votre commande est interprétée. Quelques options:\
):\echo foo
fonctionne mais cela a pour effet secondaire de désactiver les alias ou les mots-clés.si vous ne me dérange pas taper deux touches, vous pouvez choisir un caractère qui ne semble pas normalement en première position (
%
,@
,?
, choisissez votre propre) et faire un alias vide pour elle:Ensuite, entrez ce caractère, espace et votre commande:
(vous ne pourrez pas ne pas enregistrer une commande dont la substitution d’historique a été désactivée. Notez également que le 3ème caractère par défaut
$histchars
est le#
développement de l’historique ne se fait pas dans les commentaires. Si vous le modifiez et que vous entrez des commentaires à l’écran vous devez être conscient du fait que les séquences peuvent être étendues là-bas).la source
Les solutions proposées ne fonctionnent pas, par exemple, dans l'exemple suivant:
Dans ce cas, le bang peut être imprimé avec son code ASCII octal:
la source
!
signe is se situe entre guillemets, où, comme d’autres réponses, il conserve son sens de développement de l’historique. Vous pouvez utiliserbash -c 'echo '\''hello World!'\'
oubash -c "echo 'hello World"\!"'"
.Depuis Bash 4.3, vous pouvez maintenant utiliser des guillemets doubles pour citer le caractère d'expansion de l'historique:
la source
!
suivi par"
ce n'est plus spécial.echo "foo!"
va bien,echo "foo!bar"
n'est pas