3 回答
TA贡献1993条经验 获得超5个赞
在Linux(和其他Unixy系统也许),你会发现一个符号链接到实际运行可执行文件作为pid
下/proc/pid/exe
,检查一个会给你想要的东西,如果它是一个二进制。如果它是某种脚本,那可能只会给解释器。
但请注意,完全有可能启动一个进程并在它运行时删除可执行文件,留下悬空链接或什么都不留下。
TA贡献1820条经验 获得超9个赞
这将取决于语言,但据我所知,大多数编程语言都可以获取程序的“基本名称”(例如 helloworld)或完整路径(例如 /usr/bin/helloworld)。通常这作为程序的第一个参数提供,由操作系统/运行时库/解释器等插入。 例如,在 C 中,argv[0](因为我们在 C 中从 0 开始计数)给出当前的名称程序,但是调用过程会初始化这个特殊参数,因此确切的格式可能会有所不同,并且在 bash 中, $0 将扩展为执行时给定的脚本路径(我认为)。从这里:https : //gobyexample.com/command-line-arguments, “os.Args 提供对原始命令行参数的访问。请注意,此切片中的第一个值是程序的路径,而 os.Args[1:] 保存程序的参数。” 所以看起来你不需要担心 /proc 但如果你有兴趣,我如何在 C 中找到可执行文件的位置?
TA贡献1876条经验 获得超6个赞
导出的变量os.Args(它是一个切片:)[]string保存程序参数,它的第一个元素是带有完整路径的可执行文件名称。
如果可执行文件不是符号链接,您可以使用path或filepath包来获取可执行文件的文件夹,如下所示:
folder := filepath.Dir(os.Args[0])
并且您可以使用os.Readlink()来解析符号链接。
并且要测试您的可执行文件是否是符号链接,您可以使用os.Lstat()which 不尝试跟随链接(而不是os.Stat())。
所以你的最终版本应该是这样的:
s := os.Args[0]
fi, err := os.Lstat(s)
if err != nil {
panic(err) // Failed to get stats
}
// Check if it's a symlink and if so, try to resolve it
if fi.Mode()&os.ModeSymlink != 0 {
if s, err = os.Readlink(s); err != nil {
panic(err) // Failed to resolve symlink
}
}
s = filepath.Dir(s) // We only want the folder part
- 3 回答
- 0 关注
- 196 浏览
添加回答
举报