制作:代码段按预期工作

问题描述:

我正在尝试在Makefile中执行以下操作。出于某种原因,我不能让它的工作权利:制作:代码段按预期工作

  1. 获取文件
  2. 检查的第一行,如果该行以“/”
  3. 开始。如果行不,在前面加上每一个路径文件

在这里,线是我的代码:

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命令,我会得到文件的第一行。

+0

没有真正解决你的问题,但如果你更换 “SED 1Q” 头会发生什么?可能有助于缩小问题的范围。还有,你是否认为cwd就是你认为它的地方,而KERNEL_VERSION是被定义的? – 2010-11-03 12:22:57

+0

@Paul:如果他能得到文件的第一行,那么路径几乎肯定是正确的(cwd correct和KERNEL_VERSION定义)。 – Beta 2010-11-03 15:35:42

+0

不一定,因为他仅在单独运行head命令时得到第一行(“如果我单独运行head命令,则会得到该文件的第一行”),并且在Makefile中运行时,它什么也得不到(“ Head命令不会返回任何内容“) – 2010-11-03 15:40:46

我不能让你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) 

Ë DIT:

等待,这是更好的:

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