【问题标题】:readlink -f alternative in Linux 2.4Linux 2.4 中的 readlink -f 替代方案
【发布时间】:2014-10-12 17:06:09
【问题描述】:

我有一个 java 应用程序。我从应用程序中调用了一些批处理文件。 批处理文件使用 readlink -f 获取自身的完整路径。 但我在 Linux 中收到“命令未找到错误”。(Linux 2.4.18-3custom #2 Wed Aug 18 03:46:33 EDT 2004)。 我在批处理文件中尝试了 pwd 命令。但是它给了我的应用程序当前目录。但是我需要从它本身中找到批处理目录。所以,pwd 不能解决我的问题。 我实际上是在 shell 脚本上编写我的批处理文件。 而且我无法安装 coreutils。 不包括 pwd 的 readlink -f 有什么替代方法吗?

【问题讨论】:

  • 你调用批处理文件还是shell脚本?如果是shell脚本,你用的是Bash吗?
  • readlink 不是 Linux 内核的一部分,因此向我们提供您的内核版本并不能帮助我们知道您拥有哪个版本的 readlink(如果有)。相比之下,向我们提供您的发行版名称和版本可能会有所帮助。
  • 也就是说——如果您的问题是如何在没有readlink 的情况下找到脚本的位置,请参阅 BashFAQ #28:mywiki.wooledge.org/BashFAQ/028;在讨论了为什么你不应该一开始就尝试这样做之后,它然后讨论了可用的技术(及其局限性)。具体参见使用BASH_SOURCE 的示例。
  • ...由于 readlink -f 在非 Linux 平台上并未广泛使用,因此该问题的大多数迭代都有涵盖不需要它的技术的答案。

标签: linux batch-file readlink


【解决方案1】:

这是我在 Linuxquestions.org 中的 dormant blog 中的一个示例 forwarded solution。您可以让您的脚本使用它来获取路径的绝对路径。这个适用于任何版本的 Bash。您还可以获得其他外壳甚至旧外壳的其他解决方案。只需检查post

function getabspath {
    local -a T=()
    local -i I=0
    local IFS=/ A

    case "$1" in
    /*)
        __=$1
        ;;
    *)
        __=/$PWD/$1
        ;;
    esac

    while read -r -d / A; do
        case "$A" in
        ..)
            [[ I -ne 0 ]] && unset T\[--I\]
            continue
            ;;
        .|'')
            continue
            ;;
        esac

        T[I++]=$A
    done << .
$__/
.

    case "$1" in
    */)
        [[ I -ne 0 ]] && __="/${T[*]}/" || __=/
        ;;
    *)
        [[ I -ne 0 ]] && __="/${T[*]}" || __=/.
        ;;
    esac
}

用法:

getabspath your/path/here
<Do something with "$__">

考虑编译simple C solution

【讨论】:

  • 感谢您的想法。我如何使用您的方法?你在用法中说“方法名”和“路径”。但也要找到批处理的完整路径。我正在使用 shell 脚本。我尝试了你的方法,但在 linux 机器上出现了一些错误。经验。 ./test.bat:第 10 行:意外标记附近的语法错误 &lt;&lt;&lt;' ./test.bat: line 10: 读取 -r -a T1
  • @fatihemrahdurum 您必须首先知道您使用的是什么外壳。运行 bash --version 时是否收到消息?
  • 是的。我的 shell 版本是 GNU bash,版本 2.05a.0(1)-release (i686-pc-linux-gnu) 版权所有 2001 Free Software Foundation, Inc.
  • 更新后没有错误。谢谢。但是原因和pwd命令一样。它又给了app路径。我需要批量物理路径。你知道吗?错误的步骤在哪里?
  • @fatihemrahdurum 你能回复你用来获取路径的命令吗?你能告诉我为什么Can a Bash script tell what directory it's stored in? 中的解决方案不适合你吗?
【解决方案2】:

readlink 是用于 Linux 的 coreutils 软件包的一部分。因此,只需在您的系统上安装coreutils,您就可以使用readlink

【讨论】:

  • 感谢您的想法,但我无法安装 coreutils。
  • 无赖,对不起,我误会了。
猜你喜欢
  • 1970-01-01
  • 2018-03-14
  • 2017-09-17
  • 2022-08-23
  • 2012-07-14
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多