451 Stimmen

Wie kann ich das Verhalten von GNU's readlink -f auf einem Mac erhalten?

Unter Linux wird die readlink Dienstprogramm akzeptiert eine Option -f die zusätzlichen Links folgt. Dies scheint auf Mac- und möglicherweise BSD-basierten Systemen nicht zu funktionieren. Was wäre die Entsprechung?

Hier sind einige Debug-Informationen:

$ which readlink; readlink -f
/usr/bin/readlink
readlink: illegal option -f
usage: readlink [-n] [file ...]

1 Stimmen

Etwas spät, aber in Ihrer Frage fehlt ein Hinweis auf die von Ihnen verwendete Shell. Dies ist wichtig, denn readlink kann ein eingebauter oder ein externer Befehl sein.

1 Stimmen

Das würde vielleicht den Unterschied erklären. Ich bin mir aber ziemlich sicher, dass ich bei beiden Gelegenheiten die Bash verwendet habe.

3 Stimmen

Warum ist diese Option auf Macs verboten?

27voto

Andrew Punkte 471
  1. Homebrew installieren
  2. Führen Sie "brew install coreutils" aus.
  3. Führen Sie "greadlink -f Pfad" aus.

greadlink ist der gnu readlink, der -f implementiert. Sie können auch macports oder andere verwenden, ich bevorzuge homebrew.

4 Stimmen

Ich kann keinen Unterschied zu der 2010 gegebenen Antwort erkennen. stackoverflow.com/a/4031502/695671

1 Stimmen

Wenn Sie diese Befehle mit ihren normalen Namen verwenden möchten, können Sie ein "gnubin"-Verzeichnis zu Ihrem PATH in Ihrer bashrc hinzufügen: PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

21voto

James Punkte 634

Ich habe ein Skript namens realpath persönlich erstellt, das in etwa so aussieht:

#!/usr/bin/env python
import os, sys
print(os.path.realpath(sys.argv[1]))

0 Stimmen

Sie sollten dies ändern in sys.argv[1] wenn Sie möchten, dass das Skript den realen Pfad des ersten Arguments ausgibt. sys.argv[0] gibt nur den tatsächlichen Pfad des Pyton-Skripts selbst aus, was nicht sehr nützlich ist.

19 Stimmen

Hier ist die Alias-Version, für ~/.profile : alias realpath="python -c 'import os, sys; print os.path.realpath(sys.argv[1])'"

0 Stimmen

Tolle Antwort und toller Einzeiler @jwhitlock. Da der OP zitiert readlink -f Hier ist eine geänderte Version von @jwhitlocks Alias zur Unterstützung möglicher -f Flagge: alias realpath="python -c 'import os, sys; print os.path.realpath(sys.argv[2] if sys.argv[1] == \"-f\" else sys.argv[1])'"

14voto

Peeech Punkte 613

Und was ist damit?

function readlink() {
  DIR="${1%/*}"
  (cd "$DIR" && echo "$(pwd -P)")
}

0 Stimmen

Dies ist die einzige Lösung, die für mich funktioniert; ich muss Pfade wie ../../../ -> /

0 Stimmen

Dies kann nicht funktionieren, wenn Sie einen Symlink haben /usr/bin/ wie zum Beispiel die alternatives System gerne hat.

2 Stimmen

Funktioniert nicht für einzelne Dateien, sondern nur für Verzeichnisse. GNU readlink arbeitet mit Verzeichnissen, Dateien, Symlinks, etc.

12voto

Izana Punkte 1869

Eine faule Methode, die für mich funktioniert,

$ brew install coreutils
$ ln -s /usr/local/bin/greadlink /usr/local/bin/readlink
$ which readlink
/usr/local/bin/readlink
/usr/bin/readlink

2 Stimmen

Blättern Sie nicht weiter: Dies ist die prägnanteste und beste Antwort auf macOS.

0 Stimmen

Danke, zwingt mich nicht, das Original zu entfernen. und /user/local/bin/ hat Vorrang vor /user/bin/ Datei. Leicht rückgängig zu machen durch Löschen /usr/local/bin/readlink Link

0 Stimmen

Funktioniert systemweit.

12voto

yosefrow Punkte 1870

Umsetzung

  1. Gebräu installieren

Befolgen Sie die Anweisungen unter https://brew.sh/

  1. Installieren Sie das Paket coreutils

brew install coreutils

  1. Einen Alias oder Symlink erstellen

3a. Anlegen eines Alias (pro Benutzer)

Sie können Ihren Alias in ~/.bashrc, ~/.bash_profile oder an einem anderen Ort ablegen, an dem Sie Ihre Bash-Aliase zu speichern pflegen. Ich persönlich bewahre meine in ~/.bashrc auf

alias readlink=greadlink

3b. Erstellen Sie einen symbolischen Link (systemweit)

ln -s /usr/local/bin/greadlink /usr/local/bin/readlink (Kredit: Izana)

Dadurch wird ein symbolischer Link in /usr/local/bin erstellt, während die ursprüngliche Readlink-Binärdatei erhalten bleibt. Es funktioniert, weil die Suche nach readlink 2 Ergebnisse liefert. Aber das zweite in /usr/local/bin hat Vorrang.

z.B.. which readlink

Um diese Änderung rückgängig zu machen, genügt es unlink /usr/local/bin/readlink

Zusätzliche Tools

Sie können ähnliche Aliase oder Symlinks für andere Coreutils wie gmv, gdu, gdf und so weiter erstellen. Aber seien Sie sich bewusst, dass das GNU-Verhalten auf einem Mac-Rechner für andere, die an die Arbeit mit nativen Coreutils gewöhnt sind, verwirrend sein kann oder sich auf Ihrem Mac-System auf unerwartete Weise verhalten kann.

Erläuterung

coreutils ist ein brew Paket, das GNU/Linux-Kerndienstprogramme installiert, die der Mac OSX-Implementierung dieser Dienstprogramme entsprechen, so dass Sie diese verwenden können

Es kann sein, dass Sie auf Ihrem Mac OSX-System Programme oder Hilfsprogramme finden, die den Linux coreutils ("Core Utilities") ähnlich zu sein scheinen, sich aber in einigen Punkten unterscheiden (z.B. unterschiedliche Flags haben).

Das liegt daran, dass die Mac OSX-Implementierung dieser Werkzeuge anders ist. Um das ursprüngliche GNU/Linux-ähnliche Verhalten zu erhalten, können Sie die coreutils Paket über das brew Paketmanagementsystem.

Dadurch werden die entsprechenden Kerndienstprogramme installiert, denen das Präfix g . Z.B. für readlink finden Sie eine entsprechende greadlink Programm.

Für die Herstellung von readlink funktionieren wie die GNU readlink ( greadlink ), können Sie nach der Installation von coreutils einen einfachen Alias oder symbolischen Link erstellen.

0 Stimmen

Diese Lösung funktioniert nicht systemweit.

1 Stimmen

Danke @KevinC Ich habe meine Antwort um eine systemweite Option und eine Erklärung erweitert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X