Warum kann ich kein Verzeichnis mit dem vollständigen relativen Pfadargument erstellen?

Warum kann ich kein Verzeichnis mit dem vollständigen relativen Pfadargument erstellen?

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 mkdirund cpim 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"

verwandte Informationen