ubuntuusers.de

"~" im Script?

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

mike1963

Anmeldungsdatum:
28. August 2018

Beiträge: 19

Hallo allseits,

Ich dachte immer, die Tilde ("~") als Verweis auf das eigene Home-Verzeichnis kann man auch in Scripts verwenden? In der Commandline ist's klar, beispielsweise ein "cd ~" wechselt erwartungsgemäß in das eigene Home-Verzeichnis.

Aber folgendes kurzes Script bringt ein für mich überraschendes Ergebnis:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

if [ -d "~/tmp" ]; then
    echo "#1: Dir ~/tmp existiert"
else
    echo "#1: Dir ~/tmp existiert NICHT"
fi

# und jetzt der gleiche if nochmals, aber anstatt der Tilde nehmen wir ein $( echo ~ ) ...
if [ -d "$( echo ~ )/tmp" ]; then
    echo "#2: Dir ~/tmp existiert"
else
    echo "#2: Dir ~/tmp existiert NICHT"
fi

Das Ergebnis wenn man dieses testscript ("testscript.sh") aufruft:

1
2
3
4
> mkdir ~/tmp
> ./testscript.sh
#1: Dir ~/tmp existiert NICHT
#2: Dir ~/tmp existiert

Hae?!?

Warum meldet der erste if, das Verzeichnis existiert NICHT, obwohl es existiert? Kann/Darf man die Tilde als Verweis auf das eigene Home-Directory in Scripts nicht verwenden?

Oder löst die Bash die Tilde des ersten if deshalb nicht richtig auf, weil ~/tmp unter doppelten Hochkommata steckt (Wenn man die wegnimmt, funktioniert's wieder ...)?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9629

Wohnort: Münster

mike1963 schrieb:

[…] löst die Bash die Tilde des ersten if deshalb nicht richtig auf, weil ~/tmp unter doppelten Hochkommata steckt

Genau. Der Komandointerpreter bash (wie auch einige andere Shells) ersetzt ein nacktes Tildezeichen durch das Home-Verzeichnis des Benutzers. Ein quotiertes Tildezeichen bleibt ein Tildezeichen. Das funktioniert auf der Kommandozeile genauso wie im Skript.

mike1963

(Themenstarter)

Anmeldungsdatum:
28. August 2018

Beiträge: 19

kB schrieb:

mike1963 schrieb:

[…] löst die Bash die Tilde des ersten if deshalb nicht richtig auf, weil ~/tmp unter doppelten Hochkommata steckt

Genau. Der Komandointerpreter bash (wie auch einige andere Shells) ersetzt ein nacktes Tildezeichen durch das Home-Verzeichnis des Benutzers. Ein quotiertes Tildezeichen bleibt ein Tildezeichen. Das funktioniert auf der Kommandozeile genauso wie im Skript.

Thnx.

Ist aber zumindest schwer irritierend: $ - Variablen werden unter doppelten Hochkommata richtig aufgelöst, die Tilde nicht. Ich vermute, dann wird auch sowas wie der Punkt (".") (als Verweis auf das aktuelle Verzeichnis) unter doppeltem Hochkommata nicht aufgelöst. Muss ich mir merken ...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13175

mike1963 schrieb:

Ist aber zumindest schwer irritierend: $ - Variablen werden unter doppelten Hochkommata richtig aufgelöst, die Tilde nicht.

Naja, die bash hat halt verschiedene "Expansions" und die Tilde Expansion ist eine davon. Sie ist verschieden von der Parameter Expansion.

Ich vermute, dann wird auch sowas wie der Punkt (".") (als Verweis auf das aktuelle Verzeichnis) unter doppeltem Hochkommata nicht aufgelöst. Muss ich mir merken ...

Der Punkt muss nicht aufgelöst werden: in jedem Verzeichnis gibt es einen Eintrag ".", der auf das Verzeichnis selbst zeigt. Mit einem Punkt macht die Shell nix.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

1
2
3
4
5
6
7
8
if [ -d "~/tmp" ]; then
    echo "#1: Dir ~/tmp existiert"
fi

# und jetzt der gleiche if nochmals, aber anstatt der Tilde nehmen wir ein $( echo ~ ) ...
if [ -d "$( echo ~ )/tmp" ]; then
    echo "#2: Dir ~/tmp existiert"
fi

Das $(echo ~ ) wird von der Shell aufgelöst, und zwar zu /home/mike1963; danach wird dann test -d "/home/mike1963" aufgerufen, da ist die Tilde schon aufgelöst, durch das $(...).

Die Auflösungsreihenfolge ist tricky, daher sind Empfehlungen, alles auf Verdacht zu quotieren, so verhängnisvoll. ☺

Da "tmp" kein Leerzeichen enthält und auch nicht morgen magisch enthalten wird, ist fraglich, was die Quotierung überhaupt soll. Es gibt da ein passendes Fremdwort: Cargokultprogrammierung.

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Apropos Kult: Ich bin ein wahnsinnig großer Fan davon, die Tilde in Skripts zu vermeiden. Irgendwie traue ich dem Ganzen nicht vollständig.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Cranvil schrieb:

Apropos Kult: Ich bin ein wahnsinnig großer Fan davon, die Tilde in Skripts zu vermeiden. Irgendwie traue ich dem Ganzen nicht vollständig.

Und stattdessen benutzt Du $HOME oder /home/$USER oder was?

Dem traust Du mehr?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Da die eigentliche Frage bereits beantwortet ist und ich eine längere Diskussion fürchte, die andernorts besser aufgehoben ist, gehe ich an dieser Stelle nicht weiter auf die Frage ein.

Antworten |