GNU/Linux >> LINUX-Kenntnisse >  >> Linux

realpath-Befehl nicht gefunden

Es gibt mindestens zwei Programme namens realpath :

  • Ein altes Programm aus der Zeit, als GNU Coreutils readlink -f nicht enthielten . Es ist jetzt zugunsten von readlink -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 an readlink -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")

Linux
  1. Subscription-Manager:Befehl nicht gefunden

  2. dnf:Befehl nicht gefunden

  3. bc:Befehl nicht gefunden

  4. dpkg:Befehl nicht gefunden

  5. id:Befehl nicht gefunden

nc:Befehl nicht gefunden

aws-shell:Befehl nicht gefunden

kubectl:Befehl nicht gefunden

tvservice:Befehl nicht gefunden

lspci:Befehl nicht gefunden

ln:Befehl nicht gefunden