ブートイメージを作成できるように、puppetクライアントでクラウドサーバーをブートストラップするbashスクリプトに取り組んでいますが、ソースディレクトリのコンテンツが含まれている単純な「cp-r」から奇妙な動作が発生しますコピーされましたが、親ディレクトリはコピーされていません。たとえば、/ root / puppet / file1があり、cp -r /root/puppet /opt
/ opt / puppet / file1を取得する代わりに、bashスクリプトでコマンドを発行した場合、/ opt/file1を取得します。ただし、実行される直前にスクリプトでコマンドをエコーし、そのエコーの出力をコピーしてコマンドラインで実行すると、期待どおりに/ opt / puppet/file1が取得されます。
これが私のディレクトリ構造です。
mydirectory
- script.sh
- assets
- puppet
- file1
- file2
- file3
これが私のスクリプトのスニペットです
#!/bin/bash
### VARIABLE INITIALIZATION
BOOTSTRAP_DIR="/opt/bootstrapping"
# Die with an error message
die()
{
echo "**** BOOTSTRAPPING FAILED ****"
echo -e "ERROR: ${2}"
exit ${1}
}
# check the return code of the previous command and die if != 0
check_errs()
{
if [ "${1}" -ne "0" ]; then
die ${1} "${2}"
fi
}
# Get the path of the directory from which this script is being executed
SCRIPT_PATH="`dirname \"$0\"`" # relative
check_errs $? "Could not get the relative path of the executing script"
SCRIPT_PATH="`( cd \"$SCRIPT_PATH\" && pwd )`" # absolutized and normalized
check_errs $? "Could not get the absolute path of the executing script"
### DEPLOY THE BOOTSTRAPPING FILES
if [ -d "${BOOTSTRAP_DIR}" ]; then
echo "Removing ${BOOTSTRAP_DIR}"
rm -rf ${BOOTSTRAP_DIR}
check_errs $? "Could not remove ${BOOTSTRAP_DIR}"
fi
if [ ! -d "${SCRIPT_PATH}/assets/puppet" ]; then
die 1 "Can not find ${SCRIPT_PATH}/assets/puppet"
fi
if [ ! -f "${SCRIPT_PATH}/assets/rc.local" ]; then
die 1 "Can not find ${SCRIPT_PATH}/assets/rc.local"
fi
# This command succeeds, but /opt/bootstrapping/puppet does not exist afterwards.
# Instead I get /opt/bootstrapping/files...
echo "Copying ${SCRIPT_PATH}/assets/puppet to ${BOOTSTRAP_DIR}"
cp -r ${SCRIPT_PATH}/assets/puppet ${BOOTSTRAP_DIR}
check_errs $? "Could not copy ${SCRIPT_PATH}/assets/puppet to ${BOOTSTRAP_DIR}"
echo "Copying ${SCRIPT_PATH}/assets/rc.local to /etc/rc.local"
cp ${SCRIPT_PATH}/assets/rc.local /etc/rc.local
check_errs $? "Could not copy ${SCRIPT_PATH}/assets/rc.local to /etc/rc.local"
ソースディレクトリの内容だけがコピーされる理由を誰かが説明できますか?疲れているので見ない、馬鹿げた感じがします。
編集
これは間違いなく私が愚かだったケースでした。スクリプトが呼び出すときcp -r /root/assets/puppet /opt/bootstrapping
、/ opt / bootstrappingは存在しないため、cpは/ opt / bootstrappingを作成し、ソースファイルをその新しいディレクトリに配置します。この質問は、将来誰にとっても大きな価値があるとは思いません。誰かが反対しない限り、私はそれを削除してもらいたいです。