Comment imprimer «-n» sans émettre de nouvelle ligne?

16

J'essaie d'imprimer en -nutilisant la echocommande. Mais si je tape simplement echo -n, il émet uniquement une nouvelle ligne, ne s'affiche pas -n, à la place, il émet une nouvelle ligne.

Star OS
la source
Fonctionne-t-il echo -n -- -n(je n'ai pas de boîte Linux à portée de main)?
n0rd
J'installe Ubuntu sur une machine virtuelle et cela semble être très lent, attendez.
Star OS
1
J'ai vérifié - ce n'est pas le cas. Probablement parce que c'est la commande bash interne et qu'il n'utilise pas getopt(???) pour analyser la ligne de commande
n0rd
1
Cette question est posée et répondue dans pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Les applications conformes qui ... pourraient éventuellement s'attendre à faire écho à -n, devraient utiliser l'utilitaire printf dérivé du neuvième Système d'édition "
Brandin
Première question populaire que j'ai posée. Yay?
Star OS

Réponses:

28

Le problème est que l' echointerprète -ncomme un argument. Sur l'implémentation bash par défaut, cela signifie (de help echo):

  -n  do not append a newline

Il existe différentes façons de contourner cela:

  1. Faites-en quelque chose qui n'est pas une option en incluant un autre personnage. Par exemple, dites de echone pas imprimer une nouvelle ligne avec -n, puis dites-lui d'interpréter les échappements avec barre oblique inverse -eet d'ajouter la nouvelle ligne explicitement.

    $ echo -ne '-n\n'
    -n
  2. Alternativement, il suffit d'inclure un espace

    $ echo " -n"
     -n

    Cela ajoute cependant un espace dont vous ne voulez probablement pas.

  3. Utilisez un caractère non imprimable avant. Ici. J'utilise le backspace ( \b)

    $ echo -e "\b-n"
    -n

    Cela ajoute également un caractère supplémentaire que vous ne voulez probablement pas.

  4. Utilisez la ruse

    $ echo n- | rev
    -n

    La revcommande imprime simplement sa sortie inversée.

  5. Utilisez le bon outil pour le travail

    $ printf -- '-n\n'
    -n
terdon
la source
Vous avez raison de dire que tout caractère valide \ \ fera l'affaire.
Pilot6
@ Pilot6 oui, mais le problème avec cette approche (la vôtre et la mienne) est qu'elle ajoute un caractère supplémentaire. Cela peut entraîner des problèmes sur toute la ligne. Surtout si vous voulez ensuite l'analyser et essayer quelque chose comme grep '^-n'. pritnfest le chemin à parcourir, vraiment.
terdon
Eh bien, printfc'est mieux de toute façon, mais la question concerne juste echo.
Pilot6
2
Il semble echo -e "-n\c"faire exactement la chose.
Pilot6
1
\csupprime la sortie supplémentaire
Pilot6
7

Vous pouvez utiliser cette commande, mais elle ajoute un espace supplémentaire.

echo -e  "\r-n"

C'est une sorte de hack.

-e active les symboles de commande de barre oblique inverse.

\r est un retour chariot.

En fait, tout \ caractère valide fera à n'importe quel endroit de la chaîne.

Vous pouvez voir lesquels sont valides par help echo .

echo "-n"ne fonctionne pas car -nest utilisé comme paramètre pourecho .

PS La meilleure solution à mon humble avis est

echo -e "-n\c"

Il n'ajoute aucun caractère supplémentaire .

echo -e "-n\n"

imprime la même chose mais avec un nouveau caractère de ligne.

Pilot6
la source
1
Wov! C'est mieux que le mien; pouvez-vous expliquer un peu pour les "débutants" ;-)
Sadi
Merci, j'ai également remarqué que peu importe où vous ajoutez le retour chariot, au début ou à la fin.
Sadi
@Sadi oui, c'est parce que l'ajout de quelque chose en fait une option non valide. -nest valide, -nfoon'est pas ainsi qui sera imprimé.
terdon
@terdon l' man echoa aussi. Mais helpc'est un peu mieux.
Pilot6
Je sais qu'il l'a, ce n'est tout simplement pas pertinent. /bin/echoest une chose complètement différente et lorsque vous exécutez echoen bash, vous obtenez le code intégré qui peut être très différent selon votre shell.
terdon
5

Je pense que si vous voulez vraiment utiliser echouniquement, cela devrait vous satisfaire:

echo "-n "

Cela fonctionne car while -nest une option valide pour echo, -navec un espace après qu'il ne l'est pas. Comme ce n'est pas une option, il echosuffit de l'imprimer.

Sadi
la source
La plupart des téléspectateurs ici ne veulent que "-n", pas "-n".
Star OS
5

Vous pensez vraiment trop.

 echo -e \\055n

Ou sans retour à la ligne

 echo -en \\055n
Joshua
la source
Comment est printf "-n\n" une réflexion excessive?
Dmitry Grigoryev
Ouais, je viens de répondre de cette façon. Va supprimer ma réponse. Ceci est relativement portable en ce sens qu'il fonctionne avec l'écho intégré et /bin/echoau moins s'il est invoqué commeecho -e "\055n"
abligh
-en n'est pas ce que je veux.
Star OS
2

Pour étendre la réponse de @ AB, la seule façon portable d'utiliser echoest de s'abstenir d'utiliser des options comme -n. Envisagez d'utiliser à la printfplace, le cas échéant. Cette page de référence fournit plus de détails et explique très bien quand et comment echoet printfdoit être utilisée:

De nos jours, echo (1) n'est portable que si vous omettez les drapeaux et les séquences d'échappement. Utilisez plutôt printf (1) si vous avez besoin de plus que du texte brut.

Dmitry Grigoryev
la source
Je vais vous étendre une réponse, veuillez modifier la réponse.
Star OS
Je ne suis pas sûr que ce soit une bonne idée de modifier la réponse de quelqu'un d'autre au point où il aura plus de texte de ma part que de l'auteur original.
Dmitry Grigoryev
2

Dans le script Bash, vous pouvez exécuter:

echo -n -
echo n

Ou en coquille interacive:

echo -n - ; echo n

C'est echoun -personnage et un npersonnage.

jiwopene
la source
L'avez-vous essayé? Il est faux.
Pilot6
Premières sorties de commande -pilot6@Pilot6:~$. Les deuxièmes sorties n.
Pilot6
@ Pilot6 Selon que vous l'exécutez dans un terminal interactif ou dans un script bash, ce qui n'est pas spécifié dans la question. OTOH si vous en avez besoin dans le terminal, il est simple de combiner simplement les deux lignes avec &&- je ne dirais pas vraiment que cette réponse est fausse .
user12205
Je vais le modifier pour qu'il devienne beaucoup plus clair que c'est pour un script bash.
Star OS
1

Trois autres façons:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n
kos
la source
0

Tu peux courir

printf -n;echo

Testé en Busybox Ash

jiwopene
la source
Cendre? Cendre? POKEMON je veux dire, quoi?
Star OS
J'ai couru 'busybox ash'
jiwopene
Dites «Busybox» ou «Busybox Ash». Pas seulement les "cendres" parce que les gens peuvent penser à ce personnage de pokemon ou aux cendres ******* des volcans.
Star OS
Mieux. alt255alt255
Star OS
@StarOS ashest le nom de l'Almquist Shell.
muru