2012-07-19 81 views

回答

4
function realpath { 
    [ -d "$1" ] && (
     CDPATH= \cd "$1" 
     /bin/pwd 
) || (
     CDPATH= \cd "$(dirname "$1")" && 
      printf "%s/%s\n" "$(/bin/pwd)" "$(basename $1)" 
) 
} 

一些评论:

虽然功能是不可POSIX,建议用它代替至少在KSH传统name() { ... }语法这可能是在Solaris下最常用的外壳。

\cd用于vs cd以防止其他物质使用壳内建物,然后避免不需要的副作用。 /bin/pwd用于调用pwd作为非内建命令,因为它不知道父shell如何进入当前目录,因此只能得到它的真实路径。

+0

三思之后,我原来的问题是“真实路径”替代。所以jliagre的回答是正确的。 – 2012-10-25 01:56:30

-1

我就遇到了这个在Solaris 10平台上,这里是找到了答案(包括jlliagre的答案的简化版本)

完整路径,以及符号链接解析:

  • 在/ usr/bin中/密码-P
  • /bin中/密码(感谢:jlliagre)
  • 真实路径{的Linux}

全路径,没有符号链接解析:

  • 在/ usr/bin中/密码

一个需要问自己的问题是,$(其中PWD)?

+0

Solaris pwd binary不带任何参数,/ usr/bin/pwd -P严格等同于/ usr/bin/pwd和'/ bin/pwd。 – jlliagre 2012-10-25 10:06:00

0

我知道这是一个旧的q & a,但在我看来,提供的realpath函数有两个缺点。一,它改变当前的工作目录,这可能在一次(或多次)调用该函数后出人意料。二,它似乎只适用于目录路径。可能是一个比较普遍的功能如下(我是一个bash用户,只需要这个脚本,所以我跳过了backslashing。)

function realpath { 
    local base=$(basename $1) 
    local d=$(dirname $1) 
    (cd $d ; echo $(/bin/pwd)/$base) 
} 
+0

感谢您指出我以前的答案缺点。请注意,当路径组件包含空格时,您的建议将会中断。 – jlliagre 2015-06-18 06:15:34

相关问题