전체 상대 경로 매개변수를 사용하여 디렉터리를 생성할 수 없는 이유는 무엇입니까?

전체 상대 경로 매개변수를 사용하여 디렉터리를 생성할 수 없는 이유는 무엇입니까?

전체 상대 경로 매개변수를 사용하여 디렉터리를 생성할 수 없는 이유는 무엇입니까? 이것이 내가 시도한 것입니다:

#!/bin/bash
args=("$@")
# Print the command and run it. Exit the script on failure.
run()
{
        if $VERBOSE; then
                echo "$@"
                "$@"
        else
                "$@" >& /dev/null
        fi
        result=$?
        if [ $result -ne 0 ]; then
                exit $result
        fi
}
                if [ ! -d ${args[0]} ]; then
                        run mkdir -p ${args[0]}
                fi

                run cd ./release/
                run cp -rf ./html/ ${args[0]}

하지만 나는 다음을 얻습니다.

mkdir -p ./bla/bla/cloud/
cd ./release/
cp -rf ./html/ ./bla/bla/cloud/
cp: cannot create directory `./bla/bla/cloud/': No such file or directory

그래서 다음과 같이 호출될 때 스크립트가 작동하도록 하는 방법이 궁금합니다../script.sh ./bla/bla/bla/

답변1

에서 시작한다고 가정합니다 /some/dir.

mkdir -p ./bla/bla/cloud/          # create /some/dir/bla/bla/cloud
cd ./release/                      # cd /some/dir/release
cp -rf ./html/ ./bla/bla/cloud/    # copy to /some/dir/release/bla/bla/cloud

정의에 따라 현재 디렉터리를 변경하면 상대 경로도 변경됩니다.

답변2

문제는 상대 경로를 사용하고 있지만 스크립트 중간에 디렉터리를 변경했다는 것입니다. 다음 단계를 정신적으로 검토해 보면 다음과 같습니다.

# command                     # relevant absolute path(s)
./script.sh ./bla/bla/bla/    # PWD/script.sh 
mkdir -p ./bla/bla/bla/       # PWD/bla/bla/bla/
cd ./release/                 # PWD/release
cp -rf ./html/ ./bla/bla/bla/ # PWD/release/html PWD/release/bla/bla/bla   

어떻게 생성했지만 PWD/bla/bla/bla/복사를 시도했는지 확인 하고 동일한 디렉토리에 나타나야 PWD/release/bla/bla/bla/합니다 .mkdircp


이는 제안된 대안입니다. 전체 함수를 실행하기 전에 각 명령을 표시하는 run ()쉘 옵션 ( )과 명령이 오류를 반환하면 종료되는 ( )로 대체 했습니다 .xtrace-xerrexit-e

#!/bin/bash -xe

cd ./release/

if [ ! -d "$1" ]; then
        mkdir -p "$1"
fi
cp -rf ./html "$1"

관련 정보