从脚本中获取 Swift 脚本的路径

Posted

技术标签:

【中文标题】从脚本中获取 Swift 脚本的路径【英文标题】:Get path to Swift script from within script 【发布时间】:2015-10-07 10:22:36 【问题描述】:

我正在用 Swift 编写一个脚本,我希望它能够修改一些始终与脚本本身位于同一目录中的文件。有没有办法从自身内部获取脚本的路径?我试过了:

print(Process.arguments)

但这仅输出实际提供给脚本的路径,可能是完全解析的路径,只是文件名,或介于两者之间的任何内容。

我打算用swift /path/to/my/script.swift 运行脚本。

【问题讨论】:

【参考方案1】:

很快:

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)
    

【讨论】:

注意如果使用 #! 会失败它在 PATH 中(但它确实与 OP 所说的运行脚本的方式相匹配,所以没关系) @RobNapier 你是什么意思?我确实在顶部有#!/usr/bin/env swift,但那不在我的$PATH 我的意思是如果 script.swift 在你的 PATH 中,那么只要调用“script.swift”就会让它看起来像是在你当前所在的任何目录中。【参考方案2】:

接受的答案在 Swift 3 中不起作用。此外,这是一种更直接的方法:

import Foundation

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

但是,如果脚本的目录在您的 PATH 中,它会遇到 @rob-napier 指出的相同问题。

【讨论】:

这在 Swift 3 中几乎可以完美运行,但 CommandLine.arguments[0] 包含脚本名称(在 Zev 的问题中)。你想要CommandLine.arguments[1],它将包含传递的路径/脚本的名称。

以上是关于从脚本中获取 Swift 脚本的路径的主要内容,如果未能解决你的问题,请参考以下文章

从脚本中获取 virtualenv 的 bin 文件夹路径

从用户获取输入到包含空格的路径(bash脚本)[重复]

python小脚本从数据库获取文件路径通过scp下载本地

如何从脚本本身中获取 Bash 脚本的源目录?

在 Perl 中获取当前工作目录路径

如何从脚本本身中获取 Bash 脚本的源目录?