Les exemples suivants montrent qu'une nouvelle ligne est ajoutée à une chaîne here .
Pourquoi est-ce fait?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
la source
Les exemples suivants montrent qu'une nouvelle ligne est ajoutée à une chaîne here .
Pourquoi est-ce fait?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
La réponse facile est que ksh est écrit de cette façon (et bash est compatible). Mais il y a une raison pour ce choix de conception.
La plupart des commandes attendent une saisie de texte. Dans le monde Unix, un fichier texte consiste en une séquence de lignes, chacune se terminant par une nouvelle ligne . Donc, dans la plupart des cas, une nouvelle ligne finale est requise. Un cas particulièrement courant consiste à récupérer le résultat d’une commande avec une substitution de commande, à le traiter d’une manière ou d’une autre, puis à le transmettre à une autre commande. La substitution de commande supprime les nouvelles lignes finales; <<<
en remet un.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash et ksh ne peuvent de toute façon pas manipuler les données binaires (ils ne peuvent pas gérer les caractères nuls), il n’est donc pas étonnant que leurs installations soient conçues pour les données texte.
La <<<
syntaxe here-string est de toute façon principalement pratique, comme <<
ici-documents. Si vous ne devez pas ajouter de nouvelle ligne finale, utilisez echo -n
(en bash) ou printf
et un pipeline.
<<<
a été introduit dans le monde Bourne parzsh
, pasksh
. Et il a été inspiré par un opérateur similaire dans le port Unixrc
auquel il n’a pas ajouté ce caractère de nouvelle ligne supplémentaire. Fait intéressant, l'=(<<<text)
opérateur n'ajoute pas cette nouvelle ligne danszsh
.printf
, etc.) en évitant le retour à la lignebash
? Comme @ StéphaneChazelas pointé est possible danszsh
.Un scénario dans lequel il est pratique d’ajouter des nouvelles lignes à ces chaînes est lors de l’utilisation de la
read
commande lorsque leset -e
mode est actif. Rappelez-vous qu'unset -e
script se termine lorsqu'il rencontre (plus ou moins) des instructions générant un code d'état différent de zéro. Considérez queread
génère un code de statut différent de zéro lorsqu'il rencontre une chaîne sans saut de ligne:la source
Je pense que c'est le seul moyen d'obtenir une nouvelle ligne à la fin d'une chaîne ici, la preuve:
Il semblerait que l'opérateur here-string supprime les nouvelles lignes sauf si elles sont spécifiées dans la syntaxe que vous avez soumise.
la source
xxd <<<$(echo a)
.