Le code suivant décrit le mieux la situation. Pourquoi la dernière ligne ne génère-t-elle pas le caractère de retour à la ligne de fin? La sortie de chaque ligne est indiquée dans le commentaire. J'utilise GNU bash, version 4.1.5
echo -n $'a\nb\n' | xxd -p # 610a620a
x=$'a\nb\n' ; echo -n "$x" | xxd -p # 610a620a
echo -ne "a\nb\n" | xxd -p # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p # 610a62
tmp=$(somecommand; echo a); tmp=${tmp%a}
tmp=$(somecommand; echo a)
... Cela a certainement ramené le point à la maison ... Jusqu'à ce que je voie l'exemple, ma tendance aurait toujours été d'utiliserecho -n a
... mais, bien sûr !, il n'est pas nécessaire de le-n
, car la substitution de commande supprimera dans tous les cas la nouvelle ligne de fin introduite! ... merci ...Réponses:
La fonction de substitution de commandes
$()
(et son cousin le backtick) supprime spécifiquement les sauts de ligne de fin. Il s'agit du comportement documenté , et vous devez toujours en être conscient lorsque vous utilisez la construction.Les sauts de ligne à l'intérieur du corps du texte ne sont pas supprimés par l'opérateur de substitution, mais ils peuvent également être supprimés lors du fractionnement de mots sur le shell, donc la façon dont cela se produit dépend de l'utilisation ou non de guillemets. Notez la différence entre ces deux utilisations:
Dans le deuxième exemple, la sortie n'a pas été citée et la nouvelle ligne a été interprétée comme une séparation de mots, la faisant apparaître dans la sortie comme un espace!
la source
Lors de l'utilisation de la substitution de commandes, le shell exécute les commandes dans un sous-shell, renvoyant leur sortie standard. dans ce processus, les caractères IFS perdent leur signification (s'ils ne sont pas entre guillemets), car la recommandation renvoie des mots simples, donc les derniers sont supprimés. Par exemple:
et plus concrètement,
pwd
fonctionnera même si votre nom de répertoire a une nouvelle ligne entre les deux, mais$(pwd)
ne le fera pas.La solution de contournement habituelle consiste à ajouter quelque chose à la fin de votre commande et à la supprimer par la suite.
la source
echo "$(echo -e '\n')" | wc
, qui produit1 0 1
, par rapport à la2 0 2
$(pwd)
et"$(pwd)"
, voir la réponse de Caleb.