完全な相対パス引数でディレクトリを作成できないのはなぜですか?

完全な相対パス引数でディレクトリを作成できないのはなぜですか?

完全な相対パス引数でディレクトリを作成できないのはなぜですか? 試したことは次のとおりです:

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

しかし、私はこう思います:

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

そこで、次のように呼び出されたときにスクリプトを動作させるにはどうすればよいのか疑問に思います。./script.sh ./bla/bla/bla/

答え1

から始めるとします/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

定義上、現在のディレクトリを変更すると相対パスも変更されます。

答え2

問題は、相対パスを使用しているのに、スクリプトの途中でディレクトリを変更していることです。手順を頭の中でたどってみると、次のようになります。

# 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   

PWD/bla/bla/bla/を作成したが、 にコピーしようとしていることに注意してください。と が同じディレクトリにあることPWD/release/bla/bla/bla/を確認する必要があります。mkdircp


提案された代替案を以下に示します。関数全体を、実行前にすべてのコマンドを表示するrun ()シェル オプションxtrace( ) と、コマンドがエラーを返した場合に終了するシェル オプション( ) に置き換えました。-xerrexit-e

#!/bin/bash -xe

cd ./release/

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

関連情報