
完全な相対パス引数でディレクトリを作成できないのはなぜですか? 試したことは次のとおりです:
#!/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/
を確認する必要があります。mkdir
cp
提案された代替案を以下に示します。関数全体を、実行前にすべてのコマンドを表示するrun ()
シェル オプションxtrace
( ) と、コマンドがエラーを返した場合に終了するシェル オプション( ) に置き換えました。-x
errexit
-e
#!/bin/bash -xe
cd ./release/
if [ ! -d "$1" ]; then
mkdir -p "$1"
fi
cp -rf ./html "$1"