golang如何获取这种文件的绝对路径?

go代码

package main

import "fmt"

func main() {
    fmt.Println("9527")
}

我把这个go编译为/usr/bin/demo

Apple.java

#!/usr/bin/demo
其他java代码

我直接执行Apple.java,里面的go代码会被执行的,我想go获取这个Apple.java的绝对路径。

我遍历了os.Args,如果java文件是相对路径执行的,得到的就是./Apple.java,如果是绝对路径执行的,能获取到。

阅读 2.6k
avatarAI BotBETA

在Go语言中,当你通过某种方式(如通过shell脚本或直接在命令行中)执行一个编译后的Go程序(如你的/usr/bin/demo),并且这个Go程序需要知道其被哪个脚本或文件调用(在这个例子中是Apple.java),Go程序本身并不能直接获取到调用它的脚本或文件的路径。这是因为操作系统和shell环境并不直接传递这种信息给被执行的程序。

不过,有几种方法可以尝试间接获取这个信息,但每种方法都有其局限性:

  1. 通过环境变量:你可以在调用/usr/bin/demo之前,设置一个环境变量来包含Apple.java的路径,然后在Go程序中读取这个环境变量。

    #!/bin/bash
    export APPLE_JAVA_PATH=$(realpath "$0")
    /usr/bin/demo

然后在Go程序中:

package main

import (
    "fmt"
    "os"
)

func main() {
    appleJavaPath := os.Getenv("APPLE_JAVA_PATH")
    if appleJavaPath == "" {
        fmt.Println("APPLE_JAVA_PATH is not set")
    } else {
        fmt.Println("Apple.java path:", appleJavaPath)
    }
}
  1. 修改shell脚本:如果你控制调用Go程序的shell脚本,你可以在脚本中解析$0(通常是脚本自身的路径),然后将其作为参数传递给Go程序。

    #!/bin/bash
    /usr/bin/demo "$(realpath "$0")"

然后在Go程序中,你可以通过os.Args来获取这个路径:

package main

import (
    "fmt"
    "os"
)

func main() {
    if len(os.Args) > 1 {
        fmt.Println("Called by script path:", os.Args[1])
    } else {
        fmt.Println("No script path provided")
    }
}
  1. 使用符号链接:如果可能,你可以创建一个指向Apple.java的符号链接,并在Go程序中解析这个链接指向的实际文件路径。但这种方法需要额外的步骤来创建和管理符号链接,并且不适用于直接执行Apple.java(因为Apple.java本身不是可执行文件)。

注意,Apple.java文件本身不是可执行文件,你提到的#!/usr/bin/demo行是shebang行,它通常用于脚本文件(如bash脚本或Python脚本),而不是Java文件。如果你的意图是让Apple.java通过某种方式触发Go程序的执行,你可能需要编写一个包装脚本(如bash脚本),该脚本首先执行必要的操作(如编译Java代码,尽管这看起来与你的问题不直接相关),然后调用Go程序,并传递必要的参数(如Apple.java的路径)。

1 个回答
✓ 已被采纳
package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    // 获取当前可执行文件的路径
    execPath, err := os.Executable()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 获取当前执行的脚本的路径(通过 os.Args[0])
    scriptPath := os.Args[0]

    // 将路径转换为绝对路径
    absPath, err := filepath.Abs(scriptPath)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 打印绝对路径
    fmt.Println("Absolute path:", absPath)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏