¿Por qué no puedo crear un directorio mediante el argumento de ruta relativa completa?

¿Por qué no puedo crear un directorio mediante el argumento de ruta relativa completa?

¿Por qué no puedo crear un directorio mediante el argumento de ruta relativa completa? Esto es lo que intento:

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

pero me sale:

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

Entonces me pregunto cómo hacer que el script funcione cuando se llama así:./script.sh ./bla/bla/bla/

Respuesta1

Supongamos que comienza desde /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 definición, una ruta relativa cambia cuando cambia el directorio actual.

Respuesta2

El problema es que estás utilizando rutas relativas pero cambias de directorio en medio del script. Si sigues mentalmente los pasos:

# 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 cómo creó PWD/bla/bla/bla/pero está intentando copiar en PWD/release/bla/bla/bla/. Debe asegurarse de que mkdiry cpaparezcan en el mismo directorio.


He aquí una alternativa sugerida. Reemplacé toda la run ()función con las opciones de shell xtrace( -x), que muestra cada comando antes de ejecutarlo, y errexit( -e), que sale si algún comando devuelve un error.

#!/bin/bash -xe

cd ./release/

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

información relacionada