2009-01-05 262 views
2

这里的代码从一个shell脚本的一个片段我已经写:为什么'cp'在这个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不该不在乎它是否存在。究竟发生了什么问题?

+0

考虑使用 'EVAL' - 如:EVAL CP“$ src“”$ dest“...这应该确保发生shell扩展。 – 2009-01-05 18:34:32

回答

5

你已经逃脱了〜,所以它不会扩大和cp不知道该怎么做。

随着

dest=~/".${src}" 

庆典应该这样做。

+0

“3”票UP的答案稍微完整一些...... – Keltia 2009-01-05 18:35:09

10

尝试使用$HOME而不是~/作为您的主目录。

dest="$HOME/.$src" 

而且,你可能想要把周围的$src$dest变量的报价,如果你在你的文件名的任何有空格。

cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}" 
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