【问题标题】:canonicalize a path name on solaris在 solaris 上规范化路径名
【发布时间】:2010-11-17 17:37:23
【问题描述】:

在 GNU 系统上,我只会使用 readlink -f $SOME_PATH,但 Solaris 没有读取链接。

我更喜欢在 bash 中运行良好的东西,但如果需要其他程序也可以。

编辑:到目前为止我想出的最好的方法是使用 cd 和 pwd,但需要更多的技巧来处理文件而不仅仅是目录。

cd -P "$*"
REAL_PATH=`pwd`

【问题讨论】:

  • 为什么不直接下载并构建 GNU coreutils 包,然后使用其中的 readlink?我在 SunOS 和 Darwin 上都这样做过,效果很好。

标签: bash path solaris symlink


【解决方案1】:

可能有点矫枉过正,但这是操作系统可移植的,并且不需要先找到 dirname 或 basename 二进制文件.. 这种单线工作。只需在您看到 $origFile 的地方传入您的文件名:

perl -e "使用 Cwd 真实路径;打印真实路径(\"$origFile\");"

【讨论】:

  • 这适用于通常情况;不幸的是,与 Linux 相比,Cwd::realpath 在 Solaris 中的速度要慢很多(两者都是 perl 5.10)
  • 它不能移植到 Windows,因为 realpath 将输出带有正斜杠而不是反斜杠的 Windows 路径。这在许多情况下是不可取的。
  • 如果您希望在 Windows 上使用其他类型的斜杠,您可以使用 Perl 正则表达式来切换它,并在 Windows 上使用条件来执行此操作。 Perl 使这很容易,而且它仍然可以是单行的。
【解决方案2】:

this 有帮助吗?从参考页面:

使用以下内容创建一个名为 canonicalize 的文件:

#!/bin/bash
cd -P -- "$(dirname -- "$1")" &&
printf '%s\n' "$(pwd -P)/$(basename -- "$1")"

使文件可执行:

chmod +x canonicalize`

最后:

user@host$ canonicalize ./bash_profile

【讨论】:

  • 您确实应该说明实际的解决方案。我们甚至不能保证 wikipedia.org 会永远存在,更不用说“publicobject.com”了
  • 我添加了引用页面的摘录。
  • basename -- $1dirname -- $1 假定为 gnu 版本,solaris 版本不能很好地处理--
  • 规范化不仅仅是获取绝对路径,还需要遵循符号链接
【解决方案3】:
#!/bin/bash

# Resolves a full path
# - alternative to "readlink -f", which is not available on solaris
canonicalpath() {
  if [ -d $1 ]; then
    pushd $1 > /dev/null 2>&1
    echo $PWD
  elif [ -f $1 ]; then
    pushd $(dirname $1) > /dev/null 2>&1
    echo $PWD/$(basename $1)
  else
    echo "Invalid path $1"
  fi
  popd > /dev/null 2>&1
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2013-04-05
    • 2015-08-06
    • 2010-10-04
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多