bash脚本:如何找到“symlink / ..”的绝对路径?

时间:2011-06-07 15:35:28

标签: linux bash shell unix filepath

给出两个文件:

generic/scripts/hello.sh
parent/scripts -> generic/scripts

从任何位置调用parent/scripts/hello.sh后,我希望(在脚本中)找到父目录的完整路径。在这种情况下parent

主要问题是parent/scripts/..在unix中引用generic。另一方面,涉及正则表达式的所有内容都不是通用的,可能容易出错。

不起作用的解决方案:

`dirname $0`/..
realpath  `dirname $0`/..
readlink -f `dirname $0`/..
`cd *something*/..; pwd`
`perl ... abs_path(...)`

由于符号链接,所有这些都会指向generic而非parent

涉及正则表达式的所有内容都不具有适应性/通用性,对于更复杂的路径可能会失败。路径中可能还有其他..和符号链接,你想要祖父,它是一个涉及..的目录名,你通过$ PATH调用它......

此外,我希望它能在任何情况下工作,即使是通过$PATH调用它。

针对这个简单问题的任何简单安全解决方案?我的意思是它毕竟只是获取父目录!

我使用的是:

dir=$( dirname $( cd `dirname $0` >/dev/null; pwd ) )

Dunno如果它是完美的但似乎表现得像预期的那样。

6 个答案:

答案 0 :(得分:5)

试试这个:

basename $(dirname $(dirname $0))

或者只是

$(dirname $(dirname $0))

目前还不清楚您是想单独使用parent还是完整路径。

答案 1 :(得分:1)

我会推荐 1)使用pwd -P,它将始终为您提供物理路径,然后使用相对路径导航到其他地方这是最安全的。

2)使用pwd -L

答案 2 :(得分:1)

pushd $(dirname $0)
FOO=$(pwd)
popd

它为您提供运行脚本的目录的绝对路径。

答案 3 :(得分:0)

我用以下内容调用我的脚本:../script1并且它有一个相对调用../relative/script2

`(cd $0/.. && pwd)`/relative/script2

在script1

答案 4 :(得分:0)

在bash中,如果该变量可用,您可以在$PWD上执行一些string manipulation

对于父目录的路径名,请使用:

${PWD%/*}

其他例子:

me@host:/tmp/bash_string/ma ni-pu_la/tion$ echo -e \
"\$PWD or \${PWD} : " $PWD \
"\n\${PWD##/*}     : " ${PWD##/*} \
"\n\${PWD##*/}     : " ${PWD##*/} \
"\n\${PWD#/*}      : " ${PWD#/*} \
"\n\${PWD#*/}      : " ${PWD#*/} \
"\n\${PWD%%/*}     : " ${PWD%%/*} \
"\n\${PWD%%*/}     : " ${PWD%%*/} \
"\n\${PWD%/*}      : " ${PWD%/*} \
"\n\${PWD%*/}      : " ${PWD%*/} \
"\n" # Gives :
$PWD or ${PWD} :  /tmp/bash_string/ma ni-pu_la/tion 
${PWD##/*}     :  
${PWD##*/}     :  tion 
${PWD#/*}      :  tmp/bash_string/ma ni-pu_la/tion 
${PWD#*/}      :  tmp/bash_string/ma ni-pu_la/tion 
${PWD%%/*}     :  
${PWD%%*/}     :  /tmp/bash_string/ma ni-pu_la/tion 
${PWD%/*}      :  /tmp/bash_string/ma ni-pu_la 
${PWD%*/}      :  /tmp/bash_string/ma ni-pu_la/tion

答案 5 :(得分:-3)

这个怎么样:

echo `cd .. && pwd`