2012-07-19 71 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

相關問題