
¿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 mkdir
y cp
aparezcan 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"