“cp -r”在bash中表现得很奇怪吗?

时间:2012-08-03 03:32:28

标签: linux bash

我正在使用bash脚本来使用puppet客户端来引导云服务器,以便我可以创建启动映像,但是我从一个简单的“cp -r”获得了奇怪的行为,其中我的源代码的内容正在复制目录,但未复制父目录。例如,如果我有/ root / puppet / file1,并且我在bash脚本中发出了cp -r /root/puppet /opt命令,而不是获取/ opt / puppet / file1,那么我将获得/ 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,并将源文件放入该新目录中。我认为这个问题对未来的任何人都没有多大价值。除非有人反对,否则我希望将其删除。

1 个答案:

答案 0 :(得分:1)

在OS X 10.7上,cp的手册页说:

 -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?