【问题标题】:makefile : foreach error生成文件:foreach 错误
【发布时间】:2023-03-19 12:34:01
【问题描述】:

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

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

【问题讨论】:

  • -f 添加到您的ln 选项中?
  • 并非如此 - 您只是在删除任何现有的符号链接。
  • 我认为这不会有帮助,因为问题在于现有的 目录

标签: bash makefile gnu-make


【解决方案1】:
ln -sfvn source target

--force 标志使其替换现有链接 --no-dereference 避免为指向目录的链接创建“子目录”链接,如果链接已经存在(对.bash_completion.d.vim 目录有用)

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 ... ]

【讨论】:

    【解决方案2】:
    [ -f $(HOME)/$f ]
    

    仅当$(HOME)/$f 是(扩展为)文件时为真。您遇到错误的地方(.vim.bash_completion.d)是目录。试试这个:

    [ -e "$(HOME)/$f" ]
    

    (双引号不是绝对必要的,但如果$(HOME)/$f 扩展为其中包含shell 元字符的内容,您可以省去麻烦。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-02
      • 2011-10-14
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多