[linux] Bash에서 가능한 상대 경로 확장

내 스크립트에 대한 인수로 일부 파일 경로가 있습니다. 물론 그것들은 상대적 일 수 있습니다 (또는 ~을 포함 할 수 있습니다). 그러나 내가 작성한 함수의 경우 절대 경로가 필요하지만 심볼릭 링크가 해결되지 않았습니다.

이것에 대한 기능이 있습니까?



답변

MY_PATH=$(readlink -f $YOUR_ARG)같은 상대 경로를 해결할 수 "./""../"

이것도 고려하십시오 ( source ) :

#!/bin/bash
dir_resolve()
{
cd "$1" 2>/dev/null || return $?  # cd to desired directory; if fail, quell any error messages but return exit status
echo "`pwd -P`" # output full, link-resolved path
}

# sample usage
if abs_path="`dir_resolve \"$1\"`"
then
echo "$1 resolves to $abs_path"
echo pwd: `pwd` # function forks subshell, so working directory outside function is not affected
else
echo "Could not reach $1"
fi


답변

http://www.linuxquestions.org/questions/programming-9/bash-script-return-full-path-and-filename-680368/page3.html 에는 다음이 있습니다.

function abspath {
    if [[ -d "$1" ]]
    then
        pushd "$1" >/dev/null
        pwd
        popd >/dev/null
    elif [[ -e "$1" ]]
    then
        pushd "$(dirname "$1")" >/dev/null
        echo "$(pwd)/$(basename "$1")"
        popd >/dev/null
    else
        echo "$1" does not exist! >&2
        return 127
    fi
}

pushd/ popd를 사용 하여 pwd유용한 상태 가됩니다.


답변

간단한 한 줄 :

function abs_path {
  (cd "$(dirname '$1')" &>/dev/null && printf "%s/%s" "$PWD" "${1##*/}")
}

용법:

function do_something {
    local file=$(abs_path $1)
    printf "Absolute path to %s: %s\n" "$1" "$file"
}
do_something $HOME/path/to/some\ where

나는 여전히 경로가 존재하는지 여부를 완전히 모호하게 만드는 방법을 찾으려고 노력하고 있습니다 (따라서 파일을 만들 때도 사용할 수 있음).


답변

이것은 OS X에서 나를 위해 트릭을 수행합니다. $(cd SOME_DIRECTORY 2> /dev/null && pwd -P)

어디에서나 작동합니다. 다른 솔루션은 너무 복잡해 보였습니다.


답변

OS X에서 사용할 수 있습니다

stat -f "%N" YOUR_PATH

Linux에서는 realpath실행 파일 이있을 수 있습니다 . 그렇지 않은 경우 다음이 작동 할 수 있습니다 (링크뿐 아니라).

readlink -c YOUR_PATH


답변

사용 readlink -f <relative-path>예 :

export FULLPATH=`readlink -f ./`


답변

아마도 이것은 더 읽기 쉽고 서브 쉘을 사용하지 않으며 현재 디렉토리를 변경하지 않습니다.

dir_resolve() {
  local dir=`dirname "$1"`
  local file=`basename "$1"`
  pushd "$dir" &>/dev/null || return $? # On error, return error code
  echo "`pwd -P`/$file" # output full, link-resolved path with filename
  popd &> /dev/null
}