代码之家  ›  专栏  ›  技术社区  ›  waffleman

Make:代码段未按预期工作

  •  0
  • waffleman  · 技术社区  · 14 年前

    我试图在Makefile中执行以下操作。出于某种原因,我无法让它正常工作:

    1. 检查行是否以“/”开头
    2. 如果该行没有,请预先为文件中的每一行指定一个路径

    这是我的密码:

    if test $${$(shell head -n 1 ./root/lib/modules/$(KERNEL_VERSION)/modules.dep):0:1} -ne '/' then \
        cat ./root/lib/modules/$(KERNEL_VERSION)/modules.dep | while read line; do echo "/lib/modules/$(KERNEL_VERSION)/$$line"; done > /tmp/modules.dep.new; \
        cp /tmp/modules.dep.new ./root/lib/modules/$(KERNEL_VERSION)/modules.dep; \
        rm /tmp/modules.dep.new; \
    fi
    

    head命令不返回任何内容。如果我单独运行head命令,就会得到文件的第一行。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Beta    14 年前

    我拿不到你的 if test a -ne b 工作方法(shell脚本并不是我最擅长的),但我个人会这样做:

    FILE = ./root/lib/modules/$(KERNEL_VERSION)/modules.dep
    
    PREFIX = /lib/modules/$(KERNEL_VERSION)
    
    foo:
      sed -i -e 'H;$$!d;x;s/.//;/^\//!{s|^|$(PREFIX)|;s|\n|\n$(PREFIX)|g}' $(FILE)
    


    想想看,这更优雅一点:

      sed -i '1{h;s/\(.\).*/\1/;s/\//a$(PREFIX)/;s/.//;x};H;g;s/\n.*//;x;s/\n//' $(FILE)
    


    等等,这样更好:

    @sed -i '1{/^\//!{x;s/^/$(PREFIX)/;x}};G;s/\(.*\)\n\(.*\)/\2\1/' $(FILE)