Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Make:代码段未按预期工作_Linux_Bash_Scripting_Makefile - Fatal编程技术网

Linux Make:代码段未按预期工作

Linux Make:代码段未按预期工作,linux,bash,scripting,makefile,Linux,Bash,Scripting,Makefile,我正在尝试在Makefile中执行以下操作。由于某些原因,我无法使其正常工作: 获取文件的第一行 检查行是否以“/”开头 如果该行没有,则在文件中每一行的前面加上一个路径 以下是我的代码: 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

我正在尝试在Makefile中执行以下操作。由于某些原因,我无法使其正常工作:

  • 获取文件的第一行
  • 检查行是否以“/”开头
  • 如果该行没有,则在文件中每一行的前面加上一个路径
  • 以下是我的代码:

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

    如果测试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)
    

    没有真正解决您的问题,但是如果您将头部替换为“sed 1q”,会发生什么?可能有助于缩小问题的范围。此外,are=you suare cwd在您认为的位置,并且定义了KERNEL_版本?@Paul:如果他可以得到文件的第一行,那么路径几乎肯定是正确的(cwd正确,KERNEL_版本定义)。这不一定是因为他在单独运行head命令时只得到了第一行(“如果我单独运行head命令,我会得到文件的第一行。”)而在Makefile中运行时,他什么也得不到(“head命令不会返回任何内容”)@Paul:你说得对,我误解了那一行。