在Solaris上规范化路径名

4
在GNU系统上,我只需要使用readlink -f $SOME_PATH,但Solaris没有readlink。
我更喜欢在bash中使用一些有效的方法,但如果需要,其他程序也可以。
编辑:到目前为止,我想到的最好的方法是使用cd和pwd,但需要更多的技巧来处理文件而不仅仅是目录。
cd -P "$*"
REAL_PATH=`pwd`

1
为什么不直接下载并构建GNU coreutils软件包,然后使用其中的readlink呢?我在SunOS和Darwin上都这样做过,效果很好。 - Mark E. Hamilton
3个回答

6

可能有点过度设计,但这个方法可以在不需要先查找dirname或basename二进制文件的情况下进行操作系统间的移植。只需在看到$origFile的位置传入您的文件名即可使用此一行代码:

perl -e "use Cwd realpath; print realpath(\"$origFile\");"


1
这对于通常情况非常有效; 不幸的是,在Solaris上Cwd :: realpath 比Linux慢得多(在两者上都使用perl 5.10) - Brian Vandenberg
它不支持在Windows上进行操作系统移植,因为realpath将输出带有正斜杠而非反斜杠的Windows路径。在许多情况下,这是不可取的。 - John G.
如果你想在Windows上使用另一种斜杠,你可以使用Perl正则表达式来切换它,在Windows上使用条件语句。Perl使这变得足够容易,并且仍然可以是一行代码。 - Yavin5

4

这个 有帮助吗?来自参考页面:

创建一个名为canonicalize的文件,其内容如下:

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

使文件可执行:
chmod +x canonicalize`

最后:

user@host$ canonicalize ./bash_profile

你真的应该说明实际的解决方案。我们甚至不能保证维基百科将永远存在,更不用说 'publicobject.com' 了。 - Brian Vandenberg
我已经从引用页面中添加了一段摘录。 - Sean Bright
basename -- $1dirname -- $1 假设使用 GNU 版本,Solaris 版本无法处理 -- - Iwan Aucamp
规范化路径不仅仅是获取绝对路径,还需要跟随符号链接。 - rakslice

2
#!/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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接