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?

0voto

sunnz Punkte 3

Ich habe einfach das Folgende oben in meine Bash-Skripte eingefügt:

#!/usr/bin/env bash -e

declare script=$(basename "$0")
declare dirname=$(dirname "$0")
declare scriptDir
if [[ $(uname) == 'Linux' ]];then
    # use readlink -f
    scriptDir=$(readlink -f "$dirname")
else
    # can't use readlink -f, do a pwd -P in the script directory and then switch back
    if [[ "$dirname" = '.' ]];then
        # don't change directory, we are already inside
        scriptDir=$(pwd -P)
    else
        # switch to the directory and then switch back
        pwd=$(pwd)
        cd "$dirname"
        scriptDir=$(pwd -P)
        cd "$pwd"
    fi
fi

Und entfernte alle Instanzen von readlink -f . $scriptDir y $script dann für den Rest des Skripts zur Verfügung stehen wird.

Obwohl dies nicht allen Symlinks folgt, funktioniert es auf allen Systemen und scheint für die meisten Anwendungsfälle gut genug zu sein, es wechselt das Verzeichnis in den enthaltenen Ordner und führt dann eine pwd -P um den tatsächlichen Pfad dieses Verzeichnisses zu erhalten, und wechseln Sie schließlich zurück zum Original.

-2voto

scavenger Punkte 367

Die Antwort von @Keith Smith ergibt eine Endlosschleife.

Hier ist meine Antwort, die ich nur unter SunOS verwende (SunOS vermisst so viele POSIX- und GNU-Befehle).

Es handelt sich um eine Skriptdatei, die Sie in einem Ihrer $PATH-Verzeichnisse ablegen müssen:

#!/bin/sh
! (($#)) && echo -e "ERROR: readlink <link to analyze>" 1>&2 && exit 99

link="$1"
while [ -L "$link" ]; do
  lastLink="$link"
  link=$(/bin/ls -ldq "$link")
  link="${link##* -> }"
  link=$(realpath "$link")
  [ "$link" == "$lastlink" ] && echo -e "ERROR: link loop detected on $link" 1>&2 && break
done

echo "$link"

-2voto

jonjlee Punkte 13

Perl hat eine Readlink-Funktion (z.B. Wie kann ich symbolische Links in Perl kopieren? ). Dies funktioniert auf den meisten Plattformen, einschließlich OS X:

perl -e "print readlink '/path/to/link'"

Zum Beispiel:

$ mkdir -p a/b/c
$ ln -s a/b/c x
$ perl -e "print readlink 'x'"
a/b/c

5 Stimmen

Dies bewirkt dasselbe wie readlink ohne die -f Option - keine Rekursion, kein absoluter Pfad -, also können Sie auch readlink direkt.

-3voto

Carlos Nunez Punkte 1969

Das verwende ich:

stat -f %N $your_path

0 Stimmen

Dabei wird nicht der vollständige Pfad gedruckt.

-6voto

ennuikiller Punkte 44945

Die Pfade zu readlink sind in meinem System anders als in Ihrem. Bitte versuchen Sie, den vollständigen Pfad anzugeben:

/sw/sbin/readlink -f

1 Stimmen

Und was genau ist der Unterschied zwischen /sw/sbin und /usr/bin? Und warum unterscheiden sich die beiden Binärdateien?

4 Stimmen

Aha fink enthält also einen Ersatz für readlink die gnu-kompatibel ist. Das ist gut zu wissen, aber es löst mein Problem nicht, da ich mein Skript auf dem Rechner anderer Leute laufen lassen muss, und ich kann von ihnen nicht verlangen, dass sie dafür Fink installieren.

0 Stimmen

Sie antworten nicht auf die ursprüngliche Frage. Bitte schreiben Sie Ihre Antwort um.

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