【发布时间】:2021-03-05 16:06:03
【问题描述】:
I/O 块大小将在我需要编写的 Makefile 中占据显着位置,因此我需要一种计算方法。这个脚本做我想做的事:
> cat blksz.bash
#!/bin/bash
bsl=$(du --block-size=1 testfile)
bsl=($bsl)
echo ${bsl[0]}
(有人可能有更好的方法,但如果你能忍受我,那并不是问题的最普遍的观点。)
我可以从我的 Makefile 中调用它,它工作正常:
> cat Makefile
BLOCKSIZE := $(shell ./blksz.bash)
blocksize:
echo $(BLOCKSIZE)
> make blocksize
echo 4096
4096
那我觉得这个脚本这么小,放在Makefile里不是更好吗?但后来它不再起作用了。
> cat Makefile
BLOCKSIZE := $(shell bsl=$(du --block-size=1 testfile) ; \
bsl=($bsl) ; \
echo ${bsl[0]})
blocksize:
echo $(BLOCKSIZE)
> make blocksize
echo
即BLOCKSIZE 从未定义。显然,我在 Makefile 中错误地定义了 shell 命令。谁能告诉我这样做的正确方法?此外,可能有更好的方法来获取块大小,但更广泛的问题是如何从 shell 命令中获取返回值,以便 Makefile 可以看到它可能会在某个时候再次出现,这基本上是我想弄清楚什么。
最后一件事,关于重复的问题,周围有一些类似的问题,但没有什么能完全符合我的要求,AFAICT。我认为这有所不同的是,我在 shell 命令中使用了变量,并且不知何故,它们的内容正在丢失。
【问题讨论】:
-
为了直接回答你的问题,
$是一个特殊的 make 字符(它引入了 make 变量和函数),所以如果你想将它传递给 shell,你必须将它转义为$$.加上/bin/sh中不可用的 shell 变量的问题。所以你的命令必须是:BLOCKSIZE := $(shell /bin/bash -c 'bsl=$$(du --block-size=1 testfile) ; bsl=($$bsl) ; echo $${bsl[0]}')。然而,如下所述,有更好的方法来做到这一点。 -
@MadScientist 双 $ 解决了我遇到的更普遍的问题。将来会帮助我使用其他使用变量的 shell 命令。如果你把它变成一个答案,我会接受它。
-
我在下面编辑了我的答案。