echo
Une echoimplémentation strictement conforme à la spécification Single Unix ajoutera de nouvelles lignes si vous:
echo 'line1\nline2'
Mais ce n'est pas un comportement fiable. En fait, il vraiment ne importe quel comportement standard que vous pouvez attendre de echo.
OPERANDS
string
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 ...
--enable-xpg-echo-default
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.
RAISONNEMENT
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.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Voir Pourquoi est printfmeilleur que echo? pour plus.
echo() printf
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> .
Mais cela ne veut pas:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echoobligatoire? vous pouvez utiliserprintf.