makefile:foreach错误

时间:2011-07-05 20:48:31

标签: bash makefile gnu-make

我的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

并且该过程中止。 为什么没有阻止这个问题的条件?

2 个答案:

答案 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元字符的内容,则可以避免您的悲痛。)