2015-07-17 13 views
9

Sto scrivendo uno script in Swift e voglio che modifichi alcuni file che esistono sempre nella stessa directory dello script stesso. C'è un modo per ottenere il percorso verso la sceneggiatura da se stesso? Ho provato:Ottieni il percorso per lo script Swift dallo script

print(Process.arguments) 

Ma che emette solo il percorso che è stato effettivamente dato allo script, che può essere il percorso completo risolto, solo il nome del file, o nulla in mezzo.

Ho intenzione di eseguire lo script con swift /path/to/my/script.swift.

risposta

4

appena in rapida:

let cwd = FileManager.default.currentDirectoryPath 
print("script run from:\n" + cwd) 

let script = CommandLine.arguments[0]; 
print("\n\nfilepath given to script:\n" + script) 

//get script working dir 
if script.hasPrefix("/") { //absolute 
    let path = (script as NSString).deletingLastPathComponent 
    print("\n\nscript at:\n" + path) 
} else { 
    let urlCwd = URL(fileURLWithPath: cwd) 
    if let path = URL(string: script, relativeTo: urlCwd)?.path { 
     let path = (path as NSString).deletingLastPathComponent 
     print("\n\nscript at:\n" + path) 
    } 
} 
+1

Si noti che ciò non riuscirà se si utilizza #! ed è in PATH (ma corrisponde al modo in cui l'OP dice di eseguire lo script, quindi va bene) –

+0

@RobNapier cosa intendi? Ho "#!/Usr/bin/env swift' in alto, ma non nel mio' $ PATH' –

+0

Voglio dire se script.swift è nel tuo PATH, quindi basta chiamare "script.swift" per renderlo sembra che lo script sia in qualsiasi directory in cui ti trovi attualmente. –

5

La risposta accettata non funziona in Swift 3. Inoltre, questo è un approccio più diretto:

import Foundation 

let currentDirectoryURL = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) 
let url = URL(fileURLWithPath: CommandLine.arguments[1], relativeTo: currentDirectoryURL) 
print("script at: " + url.path) 

Tuttavia, ha lo stesso problema ha sottolineato fuori da @ rob-napier, se la directory dello script è nel tuo PATH.

+0

Funziona quasi perfettamente in Swift 3, ma "CommandLine.arguments [0]" contiene il nome dello script (nella domanda di Zev). Vuoi 'CommandLine.arguments [1]', che conterrebbe il nome del percorso/script passato. – worthbak

+0

@worthbak: hai ragione - hai aggiornato – ganzogo

Problemi correlati