
Warum kann ich kein Verzeichnis mit dem vollständigen relativen Pfad erstellen? Ich habe Folgendes versucht:
#!/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]}
aber ich bekomme:
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
Daher frage ich mich, wie ich ein Skript zum Laufen bringe, wenn es so aufgerufen wird:./script.sh ./bla/bla/bla/
Antwort1
Angenommen, Sie beginnen bei /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
Per Definition ändert sich ein relativer Pfad, wenn Sie das aktuelle Verzeichnis ändern.
Antwort2
Das Problem besteht darin, dass Sie relative Pfade verwenden, aber mitten im Skript die Verzeichnisse ändern. Wenn Sie die Schritte im Kopf durchgehen:
# 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
Beachten Sie, dass Sie erstellt haben PWD/bla/bla/bla/
, aber versuchen, in zu kopieren PWD/release/bla/bla/bla/
. Sie sollten sicherstellen, dass mkdir
und cp
im selben Verzeichnis vorkommen.
Hier ist ein Alternativvorschlag. Ich habe die gesamte run ()
Funktion durch die Shell-Optionen xtrace
( -x
) ersetzt, die jeden Befehl vor seiner Ausführung anzeigen, und errexit
( -e
), die beendet wird, wenn ein Befehl einen Fehler zurückgibt.
#!/bin/bash -xe
cd ./release/
if [ ! -d "$1" ]; then
mkdir -p "$1"
fi
cp -rf ./html "$1"