我的makefile中有这个,
rcFiles = .vim .vimrc .gitconfig .hgrc .screenrc .Xresources .dircolors .bashrc .ctags .bash_completion.d
install:
@$(foreach f,$(rcFiles), [ -f $(HOME)/$f ] || ln -v -s $(PWD)/$f $(HOME)/ ; )
如果.bashrc退出并尝试
make install
我得到了
ln: creating symbolic link `/home/user/.vim': File exists
ln: creating symbolic link `/home/user/.bash_completion.d': File exists
并且该过程中止。 为什么没有阻止这个问题的条件?
答案 0 :(得分:2)
ln -sfvn source target
--force
标志使其替换现有链接
如果链接已存在,则--no-dereference
可避免为目录链接创建“子目录”链接(对.bash_completion.d
和.vim
dirs非常有用)
rcFiles = .vim .vimrc .gitconfig .hgrc .screenrc .Xresources .dircolors .bashrc .ctags .bash_completion.d
install:
@$(foreach f,$(rcFiles), [ -f $(HOME)/$f ] || ln -v -f -n -s $(PWD)/$f $(HOME)/ ; )
@$(foreach f,$(rcFiles), [ -e $(HOME)/$f ] || ln -v -f -n -s $(PWD)/$f $(HOME)/ ; )
不仅要检测文件(-f
),还要检测目录。您可能希望明确检查文件和目录[ -f ... || -d ... ]
。
答案 1 :(得分:1)
[ -f $(HOME)/$f ]
仅当$(HOME)/$f
(扩展为)文件时,才为真。您收到错误的内容(.vim
和.bash_completion.d
)是目录。试试这个:
[ -e "$(HOME)/$f" ]
(双引号并非绝对必要,但如果$(HOME)/$f
扩展为包含shell元字符的内容,则可以避免您的悲痛。)