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"
Use readlink
:
$ readlink -m ~/foo.txt
/home/user/foo.txt
$ readlink -m ~/somedir/..foo.txt
/home/user/foo.txt
It also handles symlinks.
${HOME}
instead as you've mentioned.
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
.
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.
foo="~"; cd $foo
works in your bash, it is broken. The problem is that tilde expansion occurs before parameter expansion when using $foo
.
realpath -m $(eval echo "$old_path")
may or may not help you. Note thateval
is a security risk, use it responsibly.