0

ブートイメージを作成できるように、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を作成し、ソースファイルをその新しいディレクトリに配置します。この質問は、将来誰にとっても大きな価値があるとは思いません。誰かが反対しない限り、私はそれを削除してもらいたいです。

4

1 に答える 1

1

OS X 10.7 では、cp の man ページには次のように記載されています。

 -R    If source_file designates a directory, cp copies the directory and the entire subtree connected at that
       point.  If the source_file ends in a /, the contents of the directory are copied rather than the directory
       itself.  This option also causes symbolic links to be copied, rather than indirected through, and for cp to
       create special files rather than copying them as normal files.  Created directories have the same mode as
       the corresponding source directory, unmodified by the process' umask.

このオプションは実際には-R代わりに文書化されていますが-r、両方とも機能することに注意してください。

いくつかのディレクトリで次のことを試しました:

mkdir -p tmp1/tmp2/tmp3
mkdir test
cp -r tmp1 test

つまり、test には tmp1 とその子ディレクトリが含まれるようになりました。使用しているオペレーティング システムの詳細を教えてください。また、システムに非標準の cp があるかどうかを確認しましたか?

于 2012-08-03T03:48:00.663 に答える