0

Is there some native function(shell, linux command) to merge/compute the full path?

example:

old_path="~/test1/test2/../dir3//file.txt"
new_path=FUN($old_path)

echo "$new_path"   // I want get this "/home/user/test1/dir3/file.txt"    
1
  • realpath -m $(eval echo "$old_path") may or may not help you. Note that eval is a security risk, use it responsibly. Commented Jun 13, 2013 at 6:10

2 Answers 2

0

Use readlink:

$ readlink -m ~/foo.txt
/home/user/foo.txt
$ readlink -m ~/somedir/..foo.txt
/home/user/foo.txt

It also handles symlinks.

2
  • This doesn't work if the pathname is in a variable.
    – Jens
    Commented Jun 13, 2013 at 6:56
  • @Jens: You're probably referring to tilde expansion in a variable. In that event, it'd make sense to use ${HOME} instead as you've mentioned.
    – devnull
    Commented Jun 13, 2013 at 8:11
0

Does

  new_path=$(eval cd "$old_path"; pwd)

work for you? You can also use pwd -P if you want symlinks resolved. You can make life easier if you use $HOME instead of ~ in old_path. Then you don't need the eval.

6
  • Or use pwd -P. Then eval is unnecessary.
    – glglgl
    Commented Jun 13, 2013 at 6:31
  • @glglgl The eval is always needed to perform tilde expansion.
    – Jens
    Commented Jun 13, 2013 at 6:54
  • Luckily, my bash hasn't read this comment so it doesn't know about. If I enter echo $(cd ~/mp3; pwd -P), I get /home/glglgl/mp3. If I'd put it into a variable instead, the same would happen.
    – glglgl
    Commented Jun 13, 2013 at 7:00
  • does it change current working path?
    – Yifan Wang
    Commented Jun 13, 2013 at 7:49
  • @glglgl No it doesn't. You're running a different command and I suggest you actually do put it in a variable with quotes. If foo="~"; cd $foo works in your bash, it is broken. The problem is that tilde expansion occurs before parameter expansion when using $foo.
    – Jens
    Commented Jun 13, 2013 at 8:50

Not the answer you're looking for? Browse other questions tagged or ask your own question.