Por que não consigo criar um diretório pelo argumento do caminho relativo completo?

Por que não consigo criar um diretório pelo argumento do caminho relativo completo?

Por que não consigo criar um diretório pelo argumento do caminho relativo completo? Aqui está o que eu tento:

#!/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]}

mas eu entendo:

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

Então, eu me pergunto como fazer o script funcionar quando chamado assim:./script.sh ./bla/bla/bla/

Responder1

Suponha que você comece em /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

Por definição, um caminho relativo muda quando você altera o diretório atual.

Responder2

O problema é que você está usando caminhos relativos, mas altera os diretórios no meio do script. Se você seguir mentalmente as etapas:

# 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   

Observe como você criou PWD/bla/bla/bla/, mas está tentando copiar para o arquivo PWD/release/bla/bla/bla/. Você deve garantir que mkdire cpocorram no mesmo diretório.


Aqui está uma alternativa sugerida. Substituí toda a run ()função pelas opções do shell xtrace( -x), que exibe todos os comandos antes de serem executados, e errexit( -e), que sai se algum comando retornar um erro.

#!/bin/bash -xe

cd ./release/

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

informação relacionada