Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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/2/shell/5.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
Bash Makefile和shell变量_Bash_Shell_Makefile_Compilation - Fatal编程技术网

Bash Makefile和shell变量

Bash Makefile和shell变量,bash,shell,makefile,compilation,Bash,Shell,Makefile,Compilation,我在makefile中定义了这样一个变量 target: @for entry in ${FOLDERSS} ; \ do \ COUNT=$$(( $${COUNT}+1 )) ; \ if [ $$COUNT -eq 1 ] ; then \ FOLDERS="[ -s "

我在makefile中定义了这样一个变量

target:
         @for entry in ${FOLDERSS}      ; \
         do                                       \
            COUNT=$$(( $${COUNT}+1 ))   ; \
            if [ $$COUNT -eq 1 ] ; then  \
                FOLDERS="[ -s "             ; \
                aux=`echo $$entry`      ; \
                FOLDERS+=$$aux          ; \
            else                                  \
                FOLDERS+=" [ -s "       ; \
                aux=`echo $$entry`      ; \
                FOLDERS+=$$aux          ; \
                FOLDERS+=" ]"               ; \
            fi                              ; \
         done                              ; \
     FOLDERS+=" ]";\
“FoLDRSS”是在我的Mag文件中手动定义的,包含了我需要考虑的所有文件夹。现在,我要执行以下操作:

deps: target
         ${AUTOGEN} -d $${FOLDERS}) -f ${AUTOCONF};\
其中AUTOGEN是bash脚本,AUTOCONF是配置文件。文件夹应该准确地写出它包含的内容,例如: [-s/home/at/src/folder1[-s/home/at/src/folder2]] 因此,在我的makefile中执行bashscript的过程中,总的来说应该有以下命令:

./path/to/autogen -d [ -s /home/at/src/folder1 [ -s /home/at/src/folder2 ] ] -f /path/to/autoconfile
如果我在makefile中手动输入,它可以工作,但是当使用双美元符号时,它似乎无法计算可变文件夹


有人有什么建议吗?

这是一件有点奇怪的事情,也是解决问题的一种非常复杂的方法。这个怎么样

folders := $(patsubst %,[ -s %,${FOLDERSS})\
    $(patsubst %, ],${FOLDERSS})

deps: target
    ${AUTOGEN} -d $(folders)-f ${AUTOCONF}
我们声明一个Make变量
folders
,其值为
${FOLDERSS}
,在每个标记之前添加字符串
[-s
,后跟相同数量的
]
结束括号

试图使用Bash数组需要专门设置Make以使用Bash intead of
sh
;您没有使用正确的语法调用数组的值。Shell变量无论如何都不会在配方调用之间保持不变(除非您采取特殊措施强制执行此行为)。这样做基本上是无害的,但仍然是一种您希望避免的反模式


另外,您不应使用
@
禁用配方命令的打印,尤其是在调试复杂配方时。

谢谢,这样做更有意义。尽管如此,folders变量并没有给出期望的结果。出于某种原因,它跳过了到文件夹的整个路径,因此它只给出了folder1/和folder2/,这似乎与我发布的代码无关。你能显示一个粘贴库或精确代码的相似项以及你得到的输出吗?所以FOLDERSS=$(SRCDIR)/folder1$(SRCDIR)/folder2应用你所说的只给出:[-s/folder1[-s/folder2]]所以$(SRCDIR)丢失了。在我看来,在计算时SRCDIR是未设置的。这是一个演示: