2009-04-01 8 views
3

Ich versuche zu überprüfen, ob eine symbolische Verknüpfung von einem KornShell (ksh) -Skript mit "-h Dateiname" -Befehl existiert. Dies funktioniert gut auf HP-Boxen.Wenn Datei ist eine Verknüpfung auf LINUX OS

Nicht sicher, was die richtige Option für Linux-, AIX- und Solaris-Boxen ist.

Haben Sie einen Einblick?

Antwort

5

Es ist -h auf Linux-Systemen auch, zumindest (bash ist mein Shell):

lrwxrwxrwx 1 mule mule 37 Feb 27 09:43 mule.log -> /home/mule/runtime/mule/logs/mule.log 
[[email protected] ~]$ if [[ -h mule.log ]]; then echo "mule.log is a symlink that exists" ; fi 
mule.log is a symlink that exists 

prüfen man test die verfügbaren Operatoren sehen Sie auf Dateien und Strings im gegebenen enviorment verwenden zur Verfügung haben.

1

Die beste Antwort ist, zu versuchen, was auch immer die "Test" -Mannseite auf Ihrem System sagt. Wenn das zu funktionieren scheint, suchen Sie nicht weiter. Wenn es jedoch nicht zu funktionieren scheint oder wenn Sie Fragen zu obskureren Optionen zum Testen haben, sollten Sie auch die Manpage für Ihre Shell überprüfen, um zu sehen, ob 'expr' oder '[' eingebaute sind. In diesem Fall verwendet die Shell möglicherweise eine interne Implementierung, anstatt das Dienstprogramm expr aus/bin aufzurufen. Unter Solaris habe ich überprüft, dass ksh93 [als eingebaut behandelt (obwohl die Manpage dies nicht zu sagen scheint). Von der Fachwerkausgabe können Sie sehen, dass ksh den Befehl expr für [nicht ausführt.

 
% truss -f -texec /bin/ksh '[ -h /home ]' 
26056: execve("/usr/bin/ksh", 0x08047708, 0x08047714) argc = 2 
26056: execve("/usr/bin/ksh93", 0x08047708, 0x08047714) argc = 2 
26056: execve("/usr/bin/amd64/ksh93", 0x08047704, 0x08047710) argc = 2 

% truss -f -texec /bin/ksh '/bin/expr -h /home ]' 
26058: execve("/usr/bin/ksh", 0x08047700, 0x0804770C) argc = 2 
26058: execve("/usr/bin/ksh93", 0x08047700, 0x0804770C) argc = 2 
26058: execve("/usr/bin/amd64/ksh93", 0x080476FC, 0x08047708) argc = 2 
26058: execve("/bin/expr", 0x00418360, 0x00418398) argc = 4 
6

-h ist Teil der POSIX spec; es sollte überall funktionieren, was vage vernünftig ist.

Nach man test auf Mac OS X:

 
    -h file  True if file exists and is a symbolic link. This operator 
        is retained for compatibility with previous versions of 
        this program. Do not rely on its existence; use -L instead. 

-L auch standardisiert ist, also wenn Sie überall finden, dass -h nicht funktioniert, sollten Sie -L stattdessen versuchen.

0

Thw zwei mögliche Optionen sind

if [ -h filename ] 
OR 
    ls -ltr | grep filename | grep ^l 

Wenn $? Ist 0, dann ist die Datei verlinkt, sonst ist sie nicht verknüpft, ich werde stattdessen die erste Option bevorzugen.

Verwandte Themen