Je ne connaissais pas printf, avec printf ça marche: P ... alors qu'est-ce que ça fait de ne pas travailler avec echo alors?
Saeid Yazdani
Est-ce que \rinclude est inclus ou fait-il partie de CRLFnewline?
jeudi
9
Il existe de nombreuses implémentations de echocommande incompatibles les unes avec les autres. Ainsi, il est recommandé d'utiliser un outil plus standard comme printf. Voir unix.stackexchange.com/questions/65803/… pour une vue d'ensemble du problème.
Une chaîne à écrire sur la sortie standard. Si le premier opérande est -nou si l'un des opérandes contient un caractère < \barre oblique inverse> , les résultats sont définis par l'implémentation .
Sur les systèmes conformes à XSI , si le premier opérande est -n, il doit être traité comme une chaîne et non comme une option . Les séquences de caractères suivantes doivent être reconnues sur les systèmes conformes à XSI dans tous les arguments:
\a- Ecrivez une <alerte> .
\b- Ecrivez un <backspace> .
\c- Supprimez la <nouvelle ligne> qui suit sinon le dernier argument de la sortie. Tous les caractères suivant les \carguments doivent être ignorés.
\f- Ecrivez un <formulaire> .
\n- Ecrivez une <nouvelle ligne> .
\r- Ecrivez un <retour-chariot> .
\t- Ecrivez un <tab> .
\v- Ecrivez un <vertical-tab> .
\\- Écrivez un caractère <barre oblique inverse> .
\0num- Écrivez une valeur sur 8 bits représentant le nombre octal zéro, un, deux ou trois chiffres num.
Et donc il n’existe vraiment aucun moyen général de savoir écrire une nouvelle ligne echo, si ce n’est que vous pouvez généralement vous fier echoà cela.
Un bashshell n’est généralement pas conforme à la spécification et gère les -noptions, ainsi que d’autres options, mais même cela reste incertain. Tu peux faire:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Et même pas nécessaire si basha été construit avec l'option de construction ...
Faites en echosorte que les caractères intégrés par défaut utilisent une barre oblique inversée par défaut, sans nécessiter d’ -eoption. Ceci définit la valeur par défaut de l' xpg_echooption shell sur on, ce qui permet au echocomportement de Bash de se comporter davantage comme la version spécifiée dans Single Unix Specification, version 3. Pour plus d'informations sur les séquences d'échappement reconnues , voir Bash Builtinsecho .
printf
Par contre, printfle comportement de ce dernier est assez docile en comparaison.
L' printfutilitaire a été ajouté pour fournir une fonctionnalité qui a toujours été fournie par echo. Cependant, en raison de différences irréconciliables entre les différentes versions d’ echoexistant, la version présente peu de fonctionnalités spéciales, ce qui les laisse à ce nouvel printfutilitaire, qui est basé sur celui du système Ninth Edition.
La section DESCRIPTION EXTENDUE correspond presque exactement à la printf()fonction de la norme ISO C, bien qu'elle soit décrite en termes de notation de format de fichier dans la notation de format de fichier XBD .
Il gère les chaînes de format qui décrivent ses arguments - ce qui peut être n'importe quel nombre de choses, mais les chaînes sont en %bgros des chaînes yte ou des chaînes littérales %s. À part les %formats dans le premier argument, il se comporte presque comme un %bargument de chaîne yte, sauf qu'il ne gère pas l' \céchappement.
Vous pourriez écrire vos propres normes conformes echocomme ...
echo(){
printf '%b '"$@\n\c"}
... ce qui devrait presque toujours faire la bonne chose automatiquement.
En fait, non ... Cela affiche un littéral \nà la fin des arguments si le dernier argument se termine par un nombre impair de <barres obliques inverses> .
Une belle simple option "-e" pour faire fonctionner les séquences d'échappement - cela indique une autre réponse qui echon'est pas fiable et qui ne respecte pas les normes contrairement à ce qui se passe printf.
Edward
1
Assurez-vous que votre script ne contient pas de littéral \ r \ n, comme dans une tr -d "\n"commande.
Noumenon
8
Dans toutes les versions de bash que j'ai utilisées, vous pouvez simplement insérer un saut de ligne littéral dans une chaîne, de manière interactive ou dans un script, à condition que la chaîne soit suffisamment entre guillemets.
echo
obligatoire? vous pouvez utiliserprintf
.\r
include est inclus ou fait-il partie deCRLF
newline?echo
commande incompatibles les unes avec les autres. Ainsi, il est recommandé d'utiliser un outil plus standard commeprintf
. Voir unix.stackexchange.com/questions/65803/… pour une vue d'ensemble du problème.Réponses:
echo
Une
echo
implémentation strictement conforme à la spécification Single Unix ajoutera de nouvelles lignes si vous:Mais ce n'est pas un comportement fiable. En fait, il vraiment ne importe quel comportement standard que vous pouvez attendre de
echo
.Et donc il n’existe vraiment aucun moyen général de savoir écrire une nouvelle ligne
echo
, si ce n’est que vous pouvez généralement vous fierecho
à cela.Un
bash
shell n’est généralement pas conforme à la spécification et gère les-n
options, ainsi que d’autres options, mais même cela reste incertain. Tu peux faire:Et même pas nécessaire si
bash
a été construit avec l'option de construction ...printf
Par contre,
printf
le comportement de ce dernier est assez docile en comparaison.Il gère les chaînes de format qui décrivent ses arguments - ce qui peut être n'importe quel nombre de choses, mais les chaînes sont en
%b
gros des chaînes yte ou des chaînes littérales%s
. À part les%f
ormats dans le premier argument, il se comporte presque comme un%b
argument de chaîne yte, sauf qu'il ne gère pas l'\c
échappement.Voir Pourquoi est
printf
meilleur queecho
? pour plus.echo() printf
Vous pourriez écrire vos propres normes conformes
echo
comme ...... ce qui devrait presque toujours faire la bonne chose automatiquement.
En fait, non ... Cela affiche un littéral
\n
à la fin des arguments si le dernier argument se termine par un nombre impair de <barres obliques inverses> .Mais cela ne veut pas:
la source
shopt -s xpg_echo
optionecho
à utiliser-e
par défaut.-e
. Je suis surpris que personne n'ait remarqué cela sauf peut-être @HaydeSchiffPassez l'indicateur -e à écho pour lui permettre d'analyser les caractères d'échappement tels que "\ r \ n", comme suit:
la source
echo
n'est pas fiable et qui ne respecte pas les normes contrairement à ce qui se passeprintf
.tr -d "\n"
commande.Dans toutes les versions de bash que j'ai utilisées, vous pouvez simplement insérer un saut de ligne littéral dans une chaîne, de manière interactive ou dans un script, à condition que la chaîne soit suffisamment entre guillemets.
De manière interactive:
Dans un script:
la source
autres possibilités d'utilisation:
la source
Les gens ont déjà répondu de manière adéquate, mais je refuse d’accepter un monde où écho accepte une option autre que
-n
.la source
Si vous avez un personnage qui ne fait pas partie du message, vous pouvez passer à travers sed
la source