Es gibt mindestens zwei Programme namens realpath
:
- Ein altes Programm aus der Zeit, als GNU Coreutils
readlink -f
nicht enthielten . Es ist jetzt zugunsten vonreadlink -f
veraltet , so viele Distributionen führen es nicht mehr. - Die
realpath
Programm, das in GNU Coreutils 8.15 eingeführt wurde. Dies ist zu alt, um in Debian Squeeze oder sogar Wheezy zu sein; Zum Zeitpunkt des Schreibens liefert Debian Unstable es auch nicht aus. Dieses Programm ist sehr nah anreadlink -f
.
Aus irgendeinem Grund haben Sie eine Shell-Funktion, die teilweise das Verhalten von realpath
emuliert . Diese Emulation ist partiell:Wenn Sie sie über einen symbolischen Link aufrufen, folgt sie dem symbolischen Link nicht.
Da dies eine Shell-Funktion ist, wird sie vermutlich von oder über .bashrc
geladen , ist es nur für Code verfügbar, der in Ihrer interaktiven Shell ausgeführt wird. Wenn Sie möchten, dass es für andere Programme verfügbar ist, erstellen Sie unter der Annahme, dass Sie Linux verwenden, ein Skript, das realpath
emuliert :
#!/bin/sh
readlink -f -- "[email protected]"
(Dies emuliert nicht realpath
die selten verwendeten Befehlszeilenoptionen von .)
Es funktioniert nur in der Shell, da die Skriptdatei einen anderen Geltungsbereich hat und keinen Zugriff auf Ihre lokalen Funktionen und Aliase hat, die in Ihrem rc definiert sind Dateien. Und realpath
Befehl existiert tatsächlich nicht in Ihrem System.
Installieren Sie also entweder realpath
aus dem Paket, definieren Sie Ihre eigene Funktion (als Teil des Skripts, sehen Sie sich einige Beispiele an) oder beziehen Sie den rc Datei in Ihrem Skript dort, wo sie definiert ist (z. B. . ~/.bashrc
).
Hier sind die Schritte zur Installation von realpath
falls nicht vorhanden:
- Ubuntu:
sudo apt-get install coreutils
- OS X:
brew install coreutils
Ubuntu &Debian
Unter Debian oder Ubuntu scheint es der realpath
zu sein sollte standardmäßig installiert sein. Ich habe das aktuelle Debian 8 (Jessie) eingecheckt und es scheint coreutils
zu haben standardmäßig installiert.
Getestet mit frischen VM-Images:
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
Dann in VM:
$ type -a realpath
realpath is /usr/bin/realpath
Statt realpath
, können Sie auch readlink -f file
verwenden (oder greadlink
) bereitgestellt durch coreutils
auch Paket.
Ist realpath ein tatsächlicher Befehl oder ein Skript? Ich würde prüfen, woher es kommt.
$ type -a realpath
Ich bin mit diesem Tool nicht vertraut und daher ist es wahrscheinlich nicht Teil Ihrer normalen Distribution, vielleicht ist es an einem nicht standardmäßigen Ort installiert, der auf Bashs $PATH
nicht vorhanden ist befindet sich jedoch innerhalb des $PATH
Ihrer Anmeldeumgebung .
In jedem Fall das obige type
command zeigt Ihnen, woher der Befehl kommt. An diesem Punkt können Sie die Methode, die Sie ihn aufrufen, in Ihrem Skript wie folgt ändern:
echo $(/path/to/realpath test.sh)
Oder ändern Sie den $PATH
Ihres Skripts sodass auch dieser nicht standardmäßige Speicherort enthalten ist.
Funktionen in der Shell
Ein Großteil Ihrer Umgebung wird nicht aufgerufen, wenn Sie ein Shell-Skript aufrufen. Wenn Sie darüber nachdenken, ist dies sehr sinnvoll, da Sie im Allgemeinen nicht möchten, dass Skripts all das zusätzliche Gewicht haben, das die Umgebung eines Benutzers haben kann.
Sie können entweder bestimmen, welche Quelldatei diese Funktion bereitstellt, und sie entweder beziehen, oder Bash einfach anweisen, Ihre Anmeldeumgebung einzubinden.
#!/bin/bash -l
echo $(realpath "$1")