如何将path名称中的“..”转换为bash脚本中的绝对名称?

如何将path名中的..转换为bash脚本中的绝对path名。 也就是说,如果我有一个path/home/nohsib/dvc/../bop ,我想把它改成没有点的path,在这种情况下/home/nohsib/bop

我怎样才能做到这一点?

你要找的是readlink

 absolute_path=$(readlink -m /home/nohsib/dvc/../bop) 

请注意:您需要使用提供“-m”选项的GNU的readlink实现。 BSD的readlink例如没有。

尝试:

 ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd) 

使用的一个问题:

ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)

如果$ {possibleDirectory}不存在,ABSOLUTE_PATH将被设置为当前目录。 这可能不是你想要或期望的。

我认为使用这个版本可能会更令人满意:

ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)

如果$ {possibleDirectory}不存在或不可访问,由于缺less目录访问权限,ABSOLUTE_PATH将包含空string。

这样做的好处是你可以testing空string,或根据具体情况自然而然地尝试失败。 在“cd”命令失败的情况下默认当前目录可能会导致非常意想不到的结果(例如rm -rf“$ ABSOLUTE_PATH”)

如果您想要在不遵循任何符号链接的情况下执行此操作,请尝试使用具有选项-s realpath

 $ realpath -s /home/nohsib/dvc/../bop /home/nohsib/bop 

请注意,对于实际realpath ,通常除最后一个组件外都必须存在。 所以为了上面的工作,文件系统中必须包含以下内容:

 /home /home/nohsib /home/nohsib/dvc 

但是可以使用-m选项绕过该要求。

 $ realpath -sm /home/nohsib/dvc/../bop /home/nohsib/bop 

(注意realpath并不适用于所有的系统,特别是较老的非Debian系统。对于那些在embedded式Linux上工作的人来说,不幸的是Busybox realpath不支持-s-m开关。)

使用

 echo Absolute path: $(cd $1; pwd) 

另外需要注意的是,如果你当前的path在符号链接下,你可以用下面的方法解决真正的path:

 pwd -P 

为了解决你的具体问题,这将发出一个cd命令,将目录切换到没有“..”的path。 请注意,您将位于相同的文件夹中,只需使用正确的path即可:

 cd `pwd -P` 

作为GNU的readlink和realpath的替代品,我创build了一些函数,可以在独立于外部命令(如pwd和stuffs)的脚本中运行。

http://www.linuxquestions.org/questions/blog/konsolebox-210384/getting-absolute-paths-of-unix-directories-and-filenames-in-shell-scripts-3956/

其中之一是这一个。 它会将绝对path保存为$ __。 我使用阅读那里是安全的path名扩展。

 function getabspath { local -a T1 T2 local -i I=0 local IFS=/ A case "$1" in /*) read -r -a T1 <<< "$1" ;; *) read -r -a T1 <<< "/$PWD/$1" ;; esac T2=() for A in "${T1[@]}"; do case "$A" in ..) [[ I -ne 0 ]] && unset T2\[--I\] continue ;; .|'') continue ;; esac T2[I++]=$A done case "$1" in */) [[ I -ne 0 ]] && __="/${T2[*]}/" || __=/ ;; *) [[ I -ne 0 ]] && __="/${T2[*]}" || __=/. ;; esac } 

一个shell下的一个好的解决scheme是:

 readlink -ev mypathname 

它打印出解决点的完整path名称。

试试这个(假设你的相对path存储在variables$ rel_path中):

 echo "`cd $rel_path; pwd`"