
Почему я не могу создать каталог с помощью полного относительного пути? Вот что я пробую:
#!/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"