2009-01-05 263 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