Je me rends compte que cela !
a une signification particulière sur la ligne de commande dans le contexte de l'historique de la ligne de commande, mais à part cela, dans un script d'exécution, le point d'exclamation peut parfois provoquer une erreur d'analyse.
Je pense que cela a quelque chose à voir avec un event
, mais je n'ai aucune idée de ce qu'est un événement ou de ce qu'il fait. Même ainsi, la même commande peut se comporter différemment dans différentes situations.
Le dernier exemple, ci-dessous, provoque une erreur; mais pourquoi, quand le même code a fonctionné en dehors de la substitution de commande? .. en utilisant GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
aurait été plus approprié. (protégé par des `` guillemets simples '')
var=$(…)
(pas de guillemets doubles), et cela fonctionnera comme (je pense) que vous attendez. Ceci est encore « sûr » parce que la partie de la valeur d'une affectation simple n'est pas soumise à la séparation de mots ou englobement (bien que cela ne peut être vrai des missions effectuées par builtins (par exemple export
, local
etc.) sous toutes les coquilles). Malheureusement, cela ne va pas au-delà des affectations simples, car les guillemets doubles sont le moyen de se protéger contre le fractionnement et la globalisation des mots tout en obtenant d'autres types d'expansion dans d'autres contextes.