为什么'cp'在这个shell脚本中失败了?

时间:2009-01-05 18:04:17

标签: bash shell scripting

以下是我编写的shell脚本的代码片段:

for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
do
    src=$(basename ${src})
    dest="~/.${src}"
    copy="${src} -> ${dest}"
    cp $src $dest && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
done

由于某种原因,cp无法执行。例如,在$src='bashrc'的情况下,我收到此错误:

cp: ~/.bashrc: No such file or directory

我不明白为什么会发生这种情况,因为很明显,~/.bashrc目的地,而不是来源,所以cp不应该关心它是否存在或不。究竟出了什么问题?

3 个答案:

答案 0 :(得分:10)

尝试使用$HOME代替~/作为您的主目录。

dest="$HOME/.$src"

此外,如果您的文件名任何中有空格,则可能需要在$src$dest变量周围添加引号。

cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"

答案 1 :(得分:7)

当出现在那样的双引号时,

“〜”不会扩展到您的主目录。请改用"${HOME}/.${src}"。还要考虑使用另一种方法,当文件名包含空格时(哦,我只需要考虑我们所有的傻mp3文件及其中的空格!)。而不是做

for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
do
    # ...
done

体型

find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
do
    # ...
done

因此,通过结合@sirlancelots和我的空间修复,我们得到:

find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
do
    src=$(basename "${src}")
    dest="${HOME}/.${src}"
    copy="${src} -> ${dest}"
    cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
done

答案 2 :(得分:5)

你已经逃过了〜所以它不会被扩展而且cp不知道该怎么做。

使用

dest=~/".${src}"

bash应该这样做。