Ich habe Debian Squeeze AMD64. Meine aktuelle Shell ist Bash. Wenn ich Folgendes in mein Terminal schreibe, funktioniert es:
$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash
$ echo $(realpath test.sh)
/home/ffortier/test.sh
Meine test.sh-Datei sieht folgendermaßen aus:
#!/bin/bash
echo $(realpath "$1")
Wenn ich versuche, Folgendes auszuführen, erhalte ich eine Fehlermeldung
$ ./test.sh test.sh
./test.sh: line 2: realpath: command not found
Wie kann ich den Befehl realpath in einer Bash-Datei verwenden?
zusätzliche Information
$ type -a realpath
realpath is a function
realpath ()
{
f=$@;
if [ -d "$f" ]; then
base="";
dir="$f";
else
base="/$(basename "$f")";
dir=$(dirname "$f");
fi;
dir=$(cd "$dir" && /bin/pwd);
echo "$dir$base"
}
#!/bin/bash -l
.realpath
. Mein Fedora 19-System enthält jetzt dieses Tool. Beachten Sie auch, dass das OP einen Debian-Kernel mit 2.6 verwendete, so dass auch sein Systemrealpath
aufgrund seines Alters fehlte .command
waren mir immer noch nützlich. Es ist eine portablere Möglichkeit, das zu tun, was ich in POSIX-Shells gezeigt habe.Es gibt mindestens zwei Programme, die aufgerufen werden
realpath
:readlink -f
. Es wird jetzt zu Gunsten von veraltetreadlink -f
, so viele Distributionen haben aufgehört, es zu führen.realpath
in GNU coreutils 8.15 eingeführte Programm. Dies ist zu alt, um in Debian zu quetschen oder gar zu keuchen; Zum Zeitpunkt des Schreibens wird Debian Unstable auch nicht ausgeliefert . Dieses Programm ist sehr nah anreadlink -f
.Aus irgendeinem Grund haben Sie eine Shell-Funktion, die teilweise das Verhalten von emuliert
realpath
. Diese Emulation ist teilweise: Wenn Sie sie auf einer symbolischen Verknüpfung aufrufen, folgt sie nicht der symbolischen Verknüpfung.Da es sich um eine Shell-Funktion handelt, die vermutlich von oder über geladen wird
.bashrc
, ist sie nur für Code verfügbar, der in Ihrer interaktiven Shell ausgeführt wird. Wenn Sie möchten, dass es anderen Programmen zur Verfügung steht, sofern Sie Linux verwenden, erstellen Sie ein Skript, das Folgendes emuliertrealpath
:(Dies emuliert nicht die
realpath
selten verwendeten Befehlszeilenoptionen.)quelle
realpath
von Coreutils keine Beweise dafür finden, dass das Programm von Coreutils als veraltet oder nicht standardmäßig erstellt gilt. Debian muss es also entfernen.realpath
Binärdatei eingeführt, die nahe beieinander liegt, aber nicht genau mit dieser identisch istreadlink -f
. Debian Stable enthält 8.13. Debian Unstable entschied sich, das Legacy-Programm beizubehalten .openssl
?Es funktioniert nur in der Shell, da die Skriptdatei einen anderen Gültigkeitsbereich hat und keinen Zugriff auf Ihre lokalen Funktionen und Aliase hat, die in Ihren RC- Dateien definiert sind. Und ein
realpath
Befehl ist in Ihrem System tatsächlich nicht vorhanden.Also entweder
realpath
aus dem Paket installieren , eine eigene Funktion definieren (als Teil des Skripts, einige Beispiele prüfen ) oder die RC- Datei in Ihrem Skript ausgeben , in der sie definiert ist (z. ~/.bashrc
. B. ).Hier sind die Schritte zum Installieren,
realpath
wenn es nicht vorhanden ist:sudo apt-get install coreutils
brew install coreutils
Ubuntu & Debian
Unter Debian oder Ubuntu
realpath
sollte das standardmäßig installiert sein. Ich habe das aktuelle Debian 8 (Jessie) eingecheckt und es scheintcoreutils
standardmäßig installiert zu sein.Getestet mit frischen VM-Images:
Dann in VM:
Stattdessen
realpath
können Sie auch das Paketreadlink -f file
(odergreadlink
) verwendencoreutils
.quelle
quelle