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,如果是绝对路径执行的,能获取到。
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,如果是绝对路径执行的,能获取到。
在Go语言中,当你通过某种方式(如通过shell脚本或直接在命令行中)执行一个编译后的Go程序(如你的/usr/bin/demo
),并且这个Go程序需要知道其被哪个脚本或文件调用(在这个例子中是Apple.java
),Go程序本身并不能直接获取到调用它的脚本或文件的路径。这是因为操作系统和shell环境并不直接传递这种信息给被执行的程序。
不过,有几种方法可以尝试间接获取这个信息,但每种方法都有其局限性:
通过环境变量:你可以在调用/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)
}
}
修改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")
}
}
Apple.java
的符号链接,并在Go程序中解析这个链接指向的实际文件路径。但这种方法需要额外的步骤来创建和管理符号链接,并且不适用于直接执行Apple.java
(因为Apple.java
本身不是可执行文件)。注意,Apple.java
文件本身不是可执行文件,你提到的#!/usr/bin/demo
行是shebang行,它通常用于脚本文件(如bash脚本或Python脚本),而不是Java文件。如果你的意图是让Apple.java
通过某种方式触发Go程序的执行,你可能需要编写一个包装脚本(如bash脚本),该脚本首先执行必要的操作(如编译Java代码,尽管这看起来与你的问题不直接相关),然后调用Go程序,并传递必要的参数(如Apple.java
的路径)。
2 回答2.6k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
1 回答1.5k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答1.8k 阅读