获取程序**真正的所在目录的绝对路径**

要获取程序真正的所在目录的绝对路径,而不是快捷方式(符号链接)的路径,可以使用以下方法来确保获取的是实际可执行文件的位置。


方法一:通过 /proc/self/exe

这是在 Linux 中最可靠的方法,因为 /proc/self/exe 始终指向实际的可执行文件。

C语言示例

#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main() {
    char path[PATH_MAX];
    ssize_t len = readlink("/proc/self/exe", path, sizeof(path) - 1);
    if (len != -1) {
        path[len] = '\0'; // 添加字符串结束符
        printf("Executable absolute path: %s\n", path);

        // 获取所在目录
        char *last_slash = strrchr(path, '/');
        if (last_slash) {
            *last_slash = '\0';
            printf("Executable directory: %s\n", path);
        }
    } else {
        perror("readlink");
    }
    return 0;
}

方法二:使用 realpath 解决快捷方式问题

realpath 会解析符号链接并返回实际路径。

C语言示例

#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>

int main(int argc, char *argv[]) {
    char *resolved_path = realpath("/proc/self/exe", NULL);
    if (resolved_path) {
        printf("Executable absolute path: %s\n", resolved_path);

        // 获取所在目录
        char *dir = dirname(resolved_path);
        printf("Executable directory: %s\n", dir);

        free(resolved_path);
    } else {
        perror("realpath");
    }
    return 0;
}

方法三:脚本语言中的实现

Python

在 Python 中,__file__ 是脚本路径,但当脚本通过符号链接运行时,需要用 os.path.realpath 解析实际路径:

import os

# 获取可执行文件的真实路径
real_path = os.path.realpath(__file__)
print(f"Executable absolute path: {real_path}")

# 获取所在目录
directory = os.path.dirname(real_path)
print(f"Executable directory: {directory}")

Bash

在 Bash 脚本中,使用 readlinkrealpath 可确保解析符号链接:

#!/bin/bash

# 获取实际路径
SCRIPT=$(readlink -f "$0")
echo "Executable absolute path: $SCRIPT"

# 获取所在目录
SCRIPT_DIR=$(dirname "$SCRIPT")
echo "Executable directory: $SCRIPT_DIR"

方法四:Go语言

Go 提供 os.Executable 函数,结合 filepath.EvalSymlinks 可以获取真实路径:

package main

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

func main() {
    exePath, err := os.Executable()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    realPath, err := filepath.EvalSymlinks(exePath)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Executable absolute path:", realPath)

    // 获取所在目录
    dir := filepath.Dir(realPath)
    fmt.Println("Executable directory:", dir)
}

解决快捷方式路径问题的关键

  1. 使用 /proc/self/exe 或类似的系统级路径解析器,它们总是返回实际的二进制文件路径,而不是快捷方式路径。
  2. 解析符号链接,避免程序通过快捷方式运行时获取到快捷方式的位置。
  3. 获取目录时手动分割路径(如 dirnameos.path.dirname)。

无论用什么语言,实现这些方法都可以确保获取真正的程序所在目录,而不是快捷方式的位置。

无标签
评论区
头像