전체 상대 경로 매개변수를 사용하여 디렉터리를 생성할 수 없는 이유는 무엇입니까? 이것이 내가 시도한 것입니다:
#!/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/
합니다 .mkdir
cp
이는 제안된 대안입니다. 전체 함수를 실행하기 전에 각 명령을 표시하는 run ()
쉘 옵션 ( )과 명령이 오류를 반환하면 종료되는 ( )로 대체 했습니다 .xtrace
-x
errexit
-e
#!/bin/bash -xe
cd ./release/
if [ ! -d "$1" ]; then
mkdir -p "$1"
fi
cp -rf ./html "$1"