Bash: Zeichen maskieren(=?iso-8859-1?q?sch=FCtzen?=)
Hallo Liste, der Befehl ~$: echo ~ gibt das jeweilige Heimatverzeichnis aus. ~$: echo \~ gibt das Zeichen "~" aus (der Backslash schützt das folgende Zeichen). ~$: echo \~~ gibt jedoch "~~" aus. ~$: echo ~~ gibt ebenfalls "~~" aus. Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen? Ciao Achim
* achim mueller schrieb am 20.Mär.2001:
der Befehl ~$: echo ~ gibt das jeweilige Heimatverzeichnis aus.
~$: echo \~ gibt das Zeichen "~" aus (der Backslash schützt das folgende Zeichen).
~$: echo \~~ gibt jedoch "~~" aus.
~$: echo ~~ gibt ebenfalls "~~" aus.
Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen?
Nein, Richtig ist, daß der Backslash das nächste Zeichen schützt, aber das Heimatverzeichnis heißt ~ und nicht ~~. Das Heimatverzeichnis von User user heißt ~user. Es ist also ein Wort und nicht ein einzelnes Zeichen. Bernd -- Homepages von deutschsprachigen Linux-Gurus: Kristian Köhntopp: http://www.koehntopp.de/kris/artikel/ Sven Guckes: http://www.math.fu-berlin.de/~guckes/sven Robin S Socha: http://socha.net/index2.html |Zufallssignatur 10
Hi, On Tue, 20 Mar 2001, achim mueller wrote:
der Befehl ~$: echo ~ gibt das jeweilige Heimatverzeichnis aus.
Weil ~ eine variable ist.
~$: echo \~ gibt das Zeichen "~" aus (der Backslash schützt das folgende Zeichen).
right
~$: echo \~~ gibt jedoch "~~" aus.
Jedoch? Die zeichen sind zusammen echo \~<space>~ gibt ~ /home/blah Der slash schützt die erste tilde davor interpretiert zu werden und die zweite wird interpretiert.
~$: echo ~~ gibt ebenfalls "~~" aus.
Ja weil ~~ keine variable ist. Da das "zeichen" ~~ auf nix passt wird es hat einfach auf stdout geschrieben.
Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen?
Nö tut sie nicht. ~ und ~~ sind zwei einfach verschiedene "zeichen" wovon eins eine variable ist und eins nicht. Henne -- Hendrik Vogelsang aka Henne mailto: mickey@naturalbornkiller.de Asleep at the switch! I wasn't asleep! I was drunk! -- Homer Simpson Homer the Vigilante # random sigs made with fortune
Am Dienstag, 20. März 2001 23:00 schrieb Henne Vogelsang:
Ja weil ~~ keine variable ist. Da das "zeichen" ~~ auf nix passt wird es hat einfach auf stdout geschrieben.
Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen?
Nö tut sie nicht. ~ und ~~ sind zwei einfach verschiedene "zeichen" wovon eins eine variable ist und eins nicht.
War mir schon alles klar, auch das "~" eine Variable ist. Warum aber funktioniert dann z.B. "$HOME$PATH" (beide werden interpretiert) oder "\$HOME$PATH" (die erste Variable wird als String auf die stdout geschrieben, die zweite interpretiert), wie man es vermutet. Ich suche den Grund, warum zwei Tilden zusammengeschrieben nicht interpretiert werden, andere Variablen aber wohl. In der Manpage zur bash habe ich auch noch keinen vernünftigen Ansatz dazu gefunden (habe allerdings auch nur flüchtig gesucht). Mit Ausnahme vielleicht der Tatsache, daß "~username" nur dann interpretiert wird, wenn der User existiert. Ciao Achim
On 21 Mar 2001, at 6:23, achim mueller wrote:
Am Dienstag, 20. März 2001 23:00 schrieb Henne Vogelsang:
Ja weil ~~ keine variable ist. Da das "zeichen" ~~ auf nix passt wird es hat einfach auf stdout geschrieben.
Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen?
Nö tut sie nicht. ~ und ~~ sind zwei einfach verschiedene "zeichen" wovon eins eine variable ist und eins nicht.
War mir schon alles klar, auch das "~" eine Variable ist. Warum aber funktioniert dann z.B. "$HOME$PATH" (beide werden interpretiert) oder "\$HOME$PATH" (die erste Variable wird als String auf die stdout geschrieben, die zweite interpretiert), wie man es vermutet. Ich suche den Grund, warum zwei Tilden zusammengeschrieben nicht interpretiert werden, andere Variablen aber wohl. In der Manpage zur bash habe ich auch noch keinen vernünftigen Ansatz dazu gefunden (habe allerdings auch nur flüchtig gesucht). Mit Ausnahme vielleicht der Tatsache, daß "~username" nur dann interpretiert wird, wenn der User existiert.
Ich kann es Dir auch nicht hundertprozentig erklären, aber: Die Shell "erkennt" manchmal das Ende eines Variablennamens, manchmal nicht. Insbesondere ist für die Shell ein Variablenname dann zu Ende, wenn ein Zeichen auftaucht, daß nicht in einem Namen erlaubt ist. Daher wird $HOME$PATH als zwei eigenständige Variablen interpretiert. Hingegen würde $HOME_wasauchimmer nicht mehr $HOME ersetzen, sondern eine Variable $HOME_wasauchimmer suchen. (Daher bevorzuge ich in solchen Ausdrücken die Schreibweise ${HOME}${PATH}, um eindeutig die Variablenname abzugrenzen) Im Fall \$HOME$PATH ist es doch auch klar, daß nur PATH interpretiert werden kann, da du den "$" maskierst. Nun zu Deiner Frage, warum zwei Tilden zusammen nicht interpretiert werden: ~ ist demnach ein erlaubtes Zeichen für eine Variable, allerdings mit Sonderbedeutung. Analoges gilt für ~user. ~~ ist dagegen keine (!) Variable mit Sonderbedeutung, da ~ kein gültiger Username ist. Versuch mal ~wasauchimmer. Wenn wasauchimmer kein gültiger username ist, wird der String als solcher ausgegeben. Ich hoffe, das hilft Dir ein wenig. Andreas
Am Mit, 21 Mär 2001 schrieb Andreas Kyek:
On 21 Mar 2001, at 6:23, achim mueller wrote:
Am Dienstag, 20. März 2001 23:00 schrieb Henne Vogelsang:
Ja weil ~~ keine variable ist. Da das "zeichen" ~~ auf nix passt wird es hat einfach auf stdout geschrieben.
Kann mir das jemand erklären? Schützt die Tilde sich selbst und das nächste Zeichen?
Nö tut sie nicht. ~ und ~~ sind zwei einfach verschiedene "zeichen" wovon eins eine variable ist und eins nicht.
War mir schon alles klar, auch das "~" eine Variable ist. Warum aber funktioniert dann z.B. "$HOME$PATH" (beide werden interpretiert) oder "\$HOME$PATH" (die erste Variable wird als String auf die stdout geschrieben, die zweite interpretiert), wie man es vermutet. Ich suche den Grund, warum zwei Tilden zusammengeschrieben nicht interpretiert werden, andere Variablen aber wohl. In der Manpage zur bash habe ich auch noch keinen vernünftigen Ansatz dazu gefunden (habe allerdings auch nur flüchtig gesucht). Mit Ausnahme vielleicht der Tatsache, daß "~username" nur dann interpretiert wird, wenn der User existiert.
Ich kann es Dir auch nicht hundertprozentig erklären, aber:
Die Shell "erkennt" manchmal das Ende eines Variablennamens, manchmal nicht. Insbesondere ist für die Shell ein Variablenname dann zu Ende, wenn ein Zeichen auftaucht, daß nicht in einem Namen erlaubt ist. Daher wird $HOME$PATH als zwei eigenständige Variablen interpretiert. Hingegen würde $HOME_wasauchimmer nicht mehr $HOME ersetzen, sondern eine Variable $HOME_wasauchimmer suchen. (Daher bevorzuge ich in solchen Ausdrücken die Schreibweise ${HOME}${PATH}, um eindeutig die Variablenname abzugrenzen)
Im Fall \$HOME$PATH ist es doch auch klar, daß nur PATH interpretiert werden kann, da du den "$" maskierst.
Nun zu Deiner Frage, warum zwei Tilden zusammen nicht interpretiert werden: ~ ist demnach ein erlaubtes Zeichen für eine Variable, allerdings mit Sonderbedeutung. Analoges gilt für ~user. ~~ ist dagegen keine (!) Variable mit Sonderbedeutung, da ~ kein gültiger Username ist. Versuch mal ~wasauchimmer. Wenn wasauchimmer kein gültiger username ist, wird der String als solcher ausgegeben.
Ich hoffe, das hilft Dir ein wenig.
Hi, ~ ist AFAIK die einzige Variable, die nicht nach den üblichen Konventionen mit einem $ beginnt. Findet die bash ein unmaskiertes $ liest sie solange bis sie einen Worttrenner (space, tab, lf) oder ein Sonderzeichen (/...) findet und guckt dann, ob das ne Variable ist, sonst gehts unverändert an stdout: echo $HOMEA gibt nix, wenn HOMEA keine Variable ist, wenn Du die bash "austricksen" willst, aber keinen Worttrenner willst, kannst Du echo ${HOME}A nehmen, das gibt /home/irgendwasA echo $HOME/A gibt auch /home/irgendwas/A und genau das macht die bash mit ~ nicht ! Es ist offensichtlich so, daß ~ nur dann als Variablenalias für $HOME benutzt wird, wenn es von Worttrennern umgeben ist, Sonderzeichen dagegen werden nicht als Trenner akzeptiert. -- may the tux be with You! Joerg Thuemmler sysadmin@vordruckleitverlag.de
Hallo, On Mit, 21 Mär 2001, Joerg Thuemmler wrote:
~ ist AFAIK die einzige Variable, die nicht nach den ?blichen Konventionen mit einem $ beginnt.
Die Tilde ist _keine_ Variable! Die Expansion der Tilde zum Wert von $HOME ist eine Funktion der readline-Bibliothek (bzw. libtilde), und wird in tilde.[ch] der libreadline definiert bzw. ausprogrammiert. Die Tilde wird wenn ich's richtig lese nur dann expandiert wenn: ein " ", "\t", ":" "=" voraus und ein " ", "\t", "\n" oder "/" nach einem gueltigen usernamen folgt, wobei der username optional ist. -dnh -- Der Mensch ist die Krone der Scjhöpfung. Jedoch setzt dies der Schöpfung nur zu oft die Krone auf. [Woko° in dafb]
participants (6)
-
AchimMuellerRheine@t-online.de
-
Andreas Kyek
-
Bernd Brodesser
-
David Haller
-
Henne Vogelsang
-
Joerg Thuemmler