2009-10-08 1 views
1
  • 스크립트에는 하드 코딩 된 상대 경로가 있습니다. 나는 그들에게 대본의 위치에 친척이되기를 바란다.bash 프로그램에서 경로 처리를 제대로 만드는 방법은 무엇입니까?

  • 다른 프로그램 (cmake)이 필요로하는 스크립트는 현재 디렉토리를 변경해야합니다.

  • 스크립트는 인수 (호출자와 관련이있을 수 있음)를 인수로 취하여 해당 프로그램에 전달하므로 비연 관화되어야합니다.

질문 인라인 있습니다

#!/bin/sh 

# First arg should be Release or Debug  
# TODO test for that. 

if test -n "$1"; then   # BTW how to test whether $1 is Debug or Release? 
    BUILD_TYPE="$1" 
else 
    BUILD_TYPE="Release" 
fi 

# Set install prefix to current directory, unless second argument is given. 

if test -n "$2"; then 
    INSTALL_PREFIX="$2" # How to derelativize this path argument? 
else 
    INSTALL_PREFIX=bin  # How to make this path relative to script location? 
fi 

# Make build directory and do cmake, make, make install. 

mkdir -p build/${BUILD_TYPE} && # How to make this path relative to script location? 
cd build/${BUILD_TYPE} && 

cmake -D CMAKE_BUILD_TYPE=${BUILD_TYPE} \ 
     -D CMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} \ # Possible relative to caller current directory. 
     ../../ &&    # Relative to scrip position. 
make -j4 && 
make install 

는 일반적인 문제인가 아니면 표준이 아닌 방법으로 일을하고 있어요? 스크립트의 상단 (제 1 주석이 아닌 라인 #! 줄 이후)

에서

SCRIPT_DIR="$(dirname $0)" 
ORIGINAL_DIR="$(pwd)" 

넣어

+0

스크립트를 다시 만들 것을 요청하지 않습니다. 올바른 방법으로 가이드를 작성하기 만하면됩니다. –

답변

1

1)

test $1 == "Debug" 

2) 변수 절대 상대 만들려면 스크립트 :

[ "${VAR/#\//}" != "$VAR" ] || VAR="$SCRIPT_DIR/$VAR" 
[ "${VAR/#\//}" != "$VAR" ] || VAR="$ORIGINAL_DIR/$VAR" 

은 기본적으로 우리가 빈 "${VAR/#\//}"에 선도적 인 슬래시를 교체하고 그들이 $VAR은 절대 다음 다른 경우, "$VAR" 비교 :

은 시작 디렉토리에 상대적 확인하십시오. 그렇지 않으면 절대적으로 만들 디렉토리를 앞에 둡니다.

+0

선도. /? –

+0

readlink -f 명령을 찾았지만 도움이되는지 확신 할 수 없습니다. 당신은 코멘트 할 수 있습니까? –

+0

readlink -f는 symlinks를 처리하지만 절대 경로를 작성하지는 않습니다. symlink를 통해 읽을 수 있기 때문에 주어진 경로를 표준화 할 필요가 없습니다. –

1

Douglas Leeder 이외에도 을 입력하면 변수를 큰 따옴표로 묶으므로 공백 문자가 스크립트를 엉망으로 만드는 것을 방지 할 수 있습니다.

관련 문제