Y at-il un moyen de faire bash ne pas manger de nouvelles lignes dans la substitution de backtick?
Par exemple:
var=`echo line one && echo line two`
echo $var
line one line two
Ce que je veux c'est
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
effectue l' expansion des paramètres avant d' exécuter une commande, citant est nécessaire d'informerbash
que vous souhaitez imprimer une seule chaîne et non 4 mots (line
,one
,line
ettwo
). Essayez:echo a <many spaces> b
etecho "a <many spaces> b"
. Jetez un oeil à cette réponse aussi.Même si @cyrus est correct, cela ne répond pas réellement à toute la question et il n’explique aucune explication de ce qui se passe.
Alors laisse marcher à travers elle.
Newlines dans la chaîne
Déterminez d’abord la séquence d’octets attendue:
Maintenant, utilisez Commande de substitution (Section 3.5.4) pour tenter de capturer cette séquence d'octets:
Ensuite, faites un simple écho pour vérifier la séquence d'octets:
Il semble donc que la première nouvelle ligne a été remplacée par un espace et que la deuxième nouvelle ligne est restée intacte. Mais pourquoi ?
Regardons ce qui se passe réellement ici:
Premièrement, bash fera l’ extension des paramètres de shell (Section 3.5.3)
Ensuite, bash fera le fractionnement de mots (Section 3.5.7)
Ensuite, bash le traitera comme une commande simple (Section 3.2.1)
La définition des blancs (Section 2 - Définitions)
Enfin, bash appelle la commande interne echo (Section 4.2 - Commandes intégrées de Bash)
Donc, pour résumer, les nouvelles lignes sont supprimées par Word Splitting, puis echo obtient 2 arguments, "a" et "b", puis les génère séparés par des espaces et se terminant par une nouvelle ligne.
En faisant ce que @cyrus a suggéré (et supprimez la nouvelle ligne de echo avec -n), le résultat est meilleur:
Newlines à la fin de la chaîne
Ce n'est toujours pas parfait, la fin de ligne est partie. Regarder de plus près la substitution de commande (Section 3.5.4) :
Maintenant que la raison pour laquelle la nouvelle ligne disparaît est claire, bash peut être trompé pour la conserver. Pour ce faire, ajoutez une chaîne supplémentaire à la fin et supprimez-la lorsque vous utilisez la variable:
TL; DR
Ajoutez une partie supplémentaire à la fin de la sortie et des variables de citation:
la source
J'aurais mis mon petit ajout dans un commentaire sur la réponse de cYrus, mais je ne peux pas encore commenter les réponses que je pense. Je vais donc dupliquer une partie de sa réponse pour la complétude.
Ce qui se passe dans la première ligne de votre code, c’est qu’en fait, la substitution des backticks mange les retours à la ligne de fin de la sortie de la commande substituée, comme documenté . Mais il ne mange pas la nouvelle ligne entre vos deux lignes.
Ce qui se passe dans la deuxième ligne de code, c’est que l’écho est exécuté avec deux arguments, le premier et le second. Citer la variable développée résoudra le problème suivant:
echo "$var"
Ceci préservera la nouvelle ligne entre votre ligne un et votre ligne deux. Etecho
ajoutera un retour à la ligne par défaut pour que tout se passe bien.Maintenant, si vous souhaitez conserver tous les retours à la ligne dans la sortie d'une substitution de commande, une solution consiste à ajouter une autre ligne à la sortie, que vous pouvez supprimer après la substitution de commande, voir ici .
la source