2011-01-02 2 views
0

Ich habe das Verständnis, dass die Verwendung von "/../" in einem Dateispeicherort in bash eine Ebene höher gehen wird. Das ist, was ich versuche, hier zu tun:Warum läuft mein Skript bei der Verwendung von /../ nicht auf einer Ebene?

for box in {0..4} 
    do 
    for lvl in {0..24} 
    do 
    key="UNLOCKED_${box}_$lvl" 
    plutil -key "$key" -value '1' "$appdir/../Library/Preferences/com.chillingo.cuttherope.plist" 2>&1> /dev/null 
    #successCheck=$(plutil -key "$key" "/$appdir/../Library/Preferences/com.chillingo.cuttherope.plist") 
    #if [ "$successCheck" -lt 1 ]; then 
    # echo "Level ${box}-$lvl failed! " 
    #fi 
    done 
    done 

Aber ich erhalte diesen Fehler (x125):

Error: File not found at path /var/mobile/Applications/1E17CC78-AA6E-4FFA-B241-74A73FE3AB0E/CutTheRope.app/../Library/Preferences/com.chillingo.cuttherope.plist 

Jede Hilfe wäre sehr geschätzt/ Dank.

Antwort

1

/bedeutet, von der Wurzel des Dateisystems oder des Kontextes zu starten, und ../ bedeutet, eine Ebene höher zu gehen. /../ löscht effektiv die beiden aus.

um eine Stufe aufzusteigen, ../

EDIT versuchen: Mit anderen Worten, versuchen Sie in Ihrem Pfad der/vom Ende der Variablen zu entfernen.

EDIT # 2: Die beste Lösung ist wahrscheinlich die # /../

EDIT nur entfernen 3:

Dies funktionieren würde:

/var/mobile/Applications/1E17CC78-AA6E-4FFA-B241-74A73FE3AB0E/CutTheRope.app/Library/../Library/Preferences/ 

Und wenn Sie die zweite entfernt Bibliothek und die .. es sollte auch funktionieren:

/var/mobile/Applications/1E17CC78-AA6E-4FFA-B241-74A73FE3AB0E/CutTheRope.app/Library/Preferences/ 
+0

Also würde ich "$ {appdir} ../ Library/Preferences/plistname.plist" tun? –

+0

Ja :) Sie haben Recht. Ich denke ... Es könnte einfach einfacher sein, das .. obwohl zu entfernen. – jmort253

+0

Wenn ich $ {appdir} ../ Library/Preferences/plistname.plist mache, bekomme ich: Fehler: Datei nicht im Pfad /var/mobile/Applications/1E17CC78-AA6E-4FFA-B241-74A73FE3AB0E/CutTheRope.app gefunden. ./Library/Preferences/com.chillingo.cuttherope.plist –

0

Das Nachschlageverfahren ist wie folgt:

inode lookup(string path) { 
    inode cur = path[0] == '/' ? process->root_directory : process->current_directory; 
    foreach component in split(path, '/') { 
    inode next = cur.get_entry(component); 
    if (next is a file && the component is the last one) 
     return; 
    if (next is a directory) 
     cur = next; 
    else 
     return null; 
    } 
    return cur; 
} 

Es gibt keine spezielle Handhabung für ... Der Punkt ist, dass eine Datei nur als letzte Komponente des Pfades erscheinen kann. Wenn es vorher erscheint, wird der Pfad return null genommen.

Die eigentliche Implementierung (zum Beispiel in NetBSD) ist ein bisschen komplizierter.

Update: Ich sah gerade, dass in Ihrer Frage $appdir wird wahrscheinlich auf ein Verzeichnis verweisen, so dass die obige Diskussion nicht gilt. Dennoch könnte es einige symbolische Verknüpfungen geben. Wenn Sie einem Symlink folgen und dann mit .. fortfahren, wird die lookup-Funktion fortgesetzt, von wo der Symlink verweist. Ein kleines Beispiel:

$ ln -s somewhere/else/deep/in/the/path symlink 
$ ls -l symlink/.. 

Dies zu somewhere/else/deep/in/the lösen wird (sofern vorhanden). Die lookup Funktion vereinfacht nicht den Pfad symlink/.. zu . oder als ein anderes Beispiel first/../second wird nicht zu second vereinfacht werden.

Verwandte Themen