最近的任务要求利用Makefile来实现某些功能,其中涉及到使用shell的结果给变量赋值,下面提供两种自己使用的方法:
一:
export filename=boot.bin
export filesize=$(shell du -b $(filename)|cut -f1)
export file_value=$(shell expr $(filesize) \/ 1024)
export remainder=$(shell expr $(filesize) \% 1024)
export skip_value=$(shell expr $(filesize) \- $(remainder))
二:
export filesize=`du -b $(filename)|cut -f1`
export file_value=`expr $(filesize) \/ 1024`
export remainder=`expr $(filesize) \% 1024`
export skip_value=`expr $(filesize) \- $(remainder)`
可以看到第一种是 AA = $(shell pwd)
第二种是:AA = `pwd`
一般来说两种都可以,但是当有嵌套使用的命令时候,第二种就会出现弊端。 例如上面的第二种方法: 执行Makefile,输出结果如下: ll@team:~/test$ make echo boot.bin boot.bin echo du -b boot.bin|cut -f1 74808 #前面两个echo命令输出都正常 #但是第三个开始便会出错 echo expr du -b boot.bin|cut -f1\% 1024 /bin/sh: line 0: fg: no job control expr: missing operand Try 'expr --help’ for more information. du -b boot.bin echo expr du -b boot.bin|cut -f1\- expr du -b boot.bin|cut -f1 % 1024`` /bin/sh: -: command not found expr: missing operand Try 'expr --help’ for more information. cut: invalid byte, character or field list Try 'cut --help’ for more information. make: *** [all] Error 1
原因分析:使用`expr`·这种方式赋值的时候,后面其实是直接把整个命令都替换掉再执行,而不是执行完的结果再去替换,如下面这两个语句: export filesize=`du -b $(filename)|cut -f1` #这个命令结果是74808 export file_value=`expr $(filesize) / 1024`
#但是执行echo $(file_value)的时候,命令是这样被执行的:
echo `expr `du -b boot.bin|cut -f1` \/ 1024`
#file_value取到的值不是数值而是原始命令,
#但是我们期望的实际是下面这样的
echo `74808 \/ 1024` #74808除以1024
这就是为什么会报错,因为命令的嵌套导致shell的语法出错了
Makefile支持shell的写法,但和shell又有不同。 使用第一种方法就不会出错,如下: 执行make,信息输出: ll@team:~/test$ make echo boot.bin #打印名字 boot.bin echo 74808 #打印大小 74808 echo 56 #取余结果 56 echo 74752 #相减结果 74752 ================================= 一、 AA = $(shell pwd) 二、AA = `pwd` 第一种方法赋值是先执行shell命令,将命令运行的结果赋值 第二种方法赋值是先赋值(整个shell命令都当作字符来赋值),再执行命令
|