ubuntuusers.de

Shell - echo und seine Optionen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

beselbube

Anmeldungsdatum:
16. Mai 2008

Beiträge: 53

Hallo allerseits!

Ich bin gerade auf ein kleines Mysterium gestoßen, und weiß nicht so Recht, wie sich das schlüssig erklären lässt. Laut man-file von echo, unterstützt echo auch die Option --version (zur Versionsangabe natürlich). Wenn ich jetzt

1
echo --version

eingebe, printet er mir --version. Da nimmt er die eigentliche Option, die er ja eigentlich interpretieren müsste nicht, und gibt einfach nur die Option als String zurück.

Wenn man jetzt aber folgendes ausführt

1
/bin/echo --version

Kriegt man die richtigen Versionsangaben. Hat jemand dafür eine Erklärung?

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

Ich glaube, das sind zwei verschiedenen echo-Befehle. Das, was du über /bin/echo aufrufst, ist das eigentliche, eigenständige Programm echo, während der Aufruf einfach nur über echo im Terminal ein builtin-Befehl von bash ist. Siehe auch man echo wo ausdrücklich darauf hingewiesen wird, dass die Shell (also bash) ein eigenes echo haben könnte, was sich dann mit man bash auch nachweisen lässt.

Korrigiert mich, wenn ich falsch liege.

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

type echo

zeigt an, welcher Befehl verwendet wird, wenn du nur echo eingibst.

beselbube

(Themenstarter)

Anmeldungsdatum:
16. Mai 2008

Beiträge: 53

Ok, klingt alles logisch! Das in den man-Pages hatte ich auch gelesen, aber dann nur nicht den richtigen Schluss daraus gezogen..

Und echo --version beim "echo" builtin klappt nicht, weil das bash eigene echo kein --version Parameter hat!? (Weil ja builtin, und somit nur die Version der Shell zählt)

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

beselbube schrieb:

Und echo --version beim "echo" builtin klappt nicht, weil das bash eigene echo kein --version Parameter hat!? (Weil ja builtin, und somit nur die Version der Shell zählt)

Um die Frage nochmal zu beantworten... Ja, das shell buildin echo hat diesen Parameter nicht und wenn ein Befehl "shell buildin", dann nimmt die Shell, die diesen Befehl buildin hat, auch ihren buildin Befehl. Oder so...

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

builtin, nicht buildin.

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

Unangenehm.

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

mal gucken,

/bin/echo --help

Aufruf: /bin/echo [OPTION]... [ZEICHENKETTE]...

Die ZEICHENKETTEn auf die Standardausgabe ausgeben.

  -n             den abschließenden Zeilenvorschub unterdrücken
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     diese Hilfe anzeigen und beenden
      --version  Versionsinformation anzeigen und beenden

Wenn -e aktiv ist, werden die folgenden Sequenzen erkannt und umgesetzt:

  \0NNN  Zeichen mit dem ASCII‐Code NNN (oktal)
  \\     Rückschrägstrich
  \a     Alarm (BEL)
  \b     Zeichen rückwärts löschen (Backspace)
  \c     Zeilenvorschub am Ende unterdrücken
  \f     Seitenvorschub
  \n     Zeilenvorschub
  \r     Wagenrücklauf (Carriage Return)
  \t     horizontaler Tabulatorstopp
  \v     vertikaler Tabulatorstopp

man 1 bash

SHELL BUILTIN COMMANDS
  echo [-neE] [arg ...]
              Output the args, separated by spaces, followed by a newline.  The return sta-
              tus is always 0.  If -n is specified, the trailing newline is suppressed.  If
              the -e option is given, interpretation  of  the  following  backslash-escaped
              characters  is  enabled.   The -E option disables the interpretation of these
              escape characters, even on systems where they  are  interpreted  by  default.
              The xpg_echo shell option may be used to dynamically determine whether or not
              echo expands these escape characters by default.  echo does not interpret  --
              to mean the end of options.  echo interprets the following escape sequences:
              \a     alert (bell)
              \b     backspace
              \c     suppress trailing newline
              \e     an escape character
              \f     form feed
              \n     new line
              \r     carriage return
              \t     horizontal tab
              \v     vertical tab
              \\     backslash
              \0nnn  the  eight-bit  character  whose value is the octal value nnn (zero to
                     three octal digits)
              \nnn   the eight-bit character whose value is the octal  value  nnn  (one  to
                     three octal digits)

Ich würd mal sagen, das Builtin ist mindestens gleichwertig und wahrscheinlich schneller. Wenn man allerdings unbedingt /bin/echo haben will, kann man entweder eben mit vollständigem Pfad /bin/echo aufrufen, oder via

alias echo='/bin/echo'

in der ~/.bashrc oder eben in einem Script explizit angeben und so das Ganze regeln. In einem Script würde ich dann aber zum Schluss auch wieder unaliassen. Wobei sich der Sinn mir da nicht erschließt, ausser, man weiß nicht genau in welcher Shell das Script ausgeführt wird (das echo-Builtin der csh kann z.B. keine Escape-Sequenzen), aber dann hat man sowieso andere kompatibilitäts-Kalamitäten beim Schreiben des Scriptes...

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Wenn man portabel bleiben will/muss, sollte man davon ausgehen, dass echo weder Parameter noch Escape-Sequenzen interpretiert (das ist das, was POSIX vorschreibt). Für Escape-Sequenzen nimmt man besser printf, das kann die in jedem Fall.

Antworten |