解析Go中的符号链接

解析Go中的符号链接,go,symlink,Go,Symlink,如何解析Go中的符号链接 目前我调用了readlink-f,但我想要更地道的东西 package main import ( "os/exec" "fmt" ) func resolve(p string) string { cmd := exec.Command("readlink", "-f", p) out, _ := cmd.Output() return (string(out)) } func main() { fmt.Prin

如何解析Go中的符号链接

目前我调用了
readlink-f
,但我想要更地道的东西

package main

import (
    "os/exec"
    "fmt"
)

func resolve(p string) string {
    cmd := exec.Command("readlink", "-f", p)
    out, _ := cmd.Output()

    return (string(out))
}

func main() {
    fmt.Printf(resolve("/initrd.img"))
}
使用:

Lstat返回描述命名文件的FileInfo。如果文件是符号链接,则返回的FileInfo描述符号链接。Lstat不尝试跟踪链接。如果有错误,则类型为*PathError

编辑:

然后返回的
os.FileInfo
仅允许您检查“name”是否为链接(
fi.Mode()&os.ModeSymlink!=0
)。如果是,则使用获取指针对象:

func Readlink(name string) (string, error)
Readlink返回命名符号链接的目标。如果有错误,则类型为*PathError

EvalSymlinks在计算任何符号链接后返回路径名。如果路径是相对的,则结果将相对于当前目录,除非其中一个组件是绝对符号链接

例子 树:

filepath.EvalSymlinks()

注意:非绝对路径(
cd/bin

还有更糟的事

 filepath.EvalSymlinks("/bin/bash") // => /bin/bash
 // but
 os.Readlink("/bin/bash") // => error: readlink /bin/bash: invalid argument

不适用于游乐场

FileInfo结构在哪里提供链接的目标?
s,:=os.Readlink(p);return s
是的。嗯,你为什么一直在所有答案的底部添加标签?标签使用标签功能处理问题。答案是否定的。
/bin/sh -> bash
/usr/lib/libresolv.so -> ../../lib/libresolv.so.2
os.Readlink("/bin/sh") // => bash
os.Readlink("/usr/lib/libresolv.so") //=> ../../lib/libresolv.so.2
filepath.EvalSymlinks("/bin/sh") // => /bin/bash
filepath.EvalSymlinks("/usr/lib/libresolv.so") //=> /lib/libresolv-2.20.so
 filepath.EvalSymlinks("sh") // => bash
 filepath.EvalSymlinks("/bin/sh") // => /bin/bash
 filepath.EvalSymlinks("/bin/bash") // => /bin/bash
 // but
 os.Readlink("/bin/bash") // => error: readlink /bin/bash: invalid argument