Как преобразовать ..
в именах путей в абсолютные имена путей в bash script. То есть, если у меня есть путь /home/nohsib/dvc/../bop
, я хочу, чтобы это было изменено на путь без точек в нем, в этом случае /home/nohsib/bop
Как я могу это сделать?
Как преобразовать ..
в именах путей в абсолютные имена путей в bash script. То есть, если у меня есть путь /home/nohsib/dvc/../bop
, я хочу, чтобы это было изменено на путь без точек в нем, в этом случае /home/nohsib/bop
Как я могу это сделать?
Что вы ищете, это readlink
:
absolute_path=$(readlink -m /home/nohsib/dvc/../bop)
Обратите внимание: вам нужно использовать реализацию GNU readlink
, которая предлагает параметр "-m". BSD readlink
, например, не делает.
Try:
ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)
Одна проблема с использованием:
ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)
заключается в том, что если ${possibleDirectory} не существует, ABSOLUTE_PATH будет установлен в текущий каталог. Это, вероятно, НЕ то, что вы хотите или ожидаете.
Я думаю, что использование этой версии может быть более желательным в целом:
ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)
Если ${possibleDirectory} не существует или недоступен, из-за отсутствия разрешений доступа к каталогу, ABSOLUTE_PATH будет содержать пустую строку.
Преимущество этого заключается в том, что вы можете затем проверить пустую строку или позволить ей сбой естественным образом, в зависимости от обстоятельств. По умолчанию текущая директория в случае неудачной команды "cd" может привести к очень неожиданным и, возможно, катастрофическим результатам (например, rm -rf "$ ABSOLUTE_PATH" )
Если вы хотите сделать это без каких-либо символических ссылок, попробуйте использовать realpath
с опцией -s
:
$ 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. Для тех, кто работает во встроенной Linux, к сожалению, Busybox realpath
не поддерживает переключатели -s
или -m
.)
Использование
echo Absolute path: $(cd $1; pwd)
Просто добавьте примечание, если ваш текущий путь находится под символической ссылкой, вы можете разрешить истинный путь с помощью этого:
pwd -P
Чтобы решить вашу конкретную проблему, вы получите команду cd
, чтобы сменить каталог на путь без ".." в нем. Обратите внимание, что вы будете в одной папке, только с правильным путем:
cd `pwd -P`
В качестве альтернативы GNU readlink и realpath я также создал функции, которые будут выполняться в сценариях, не зависящих от внешних команд, таких как pwd и stuffs.
Один из них - это один. Он сохранит абсолютный путь до $__. Я использовал здесь, чтобы быть уверенным в расширении пути.
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
}
одним хорошим решением под оболочкой будет:
readlink -ev mypathname
Он печатает полное имя пути с разрешенными точками.
Попробуйте это (если ваш относительный путь хранится в переменной $rel_path):
echo "`cd $rel_path; pwd`"