在带有tcsh shell的makefile中使用foreach循环

在带有tcsh shell的makefile中使用foreach循环,makefile,csh,tcsh,Makefile,Csh,Tcsh,我正在尝试运行: SHELL =/usr/bin/tcsh foo: @foreach i ( "a" "b" "c")\ echo $$i\ end 但是我得到了这个错误 i: Undefined variable. make: *** [foo] Error 1 我发现了这个,但看起来它使用的是bash,而不是tcsh。简单的回答是,您不应该使用tcsh,至少不应该使用makefile。我个人的观点是,现在是时候了,所有的衍生品都被扔进了历史的垃圾桶。但它们

我正在尝试运行:

SHELL   =/usr/bin/tcsh
foo: 
    @foreach i ( "a" "b" "c")\
    echo $$i\
    end
但是我得到了这个错误

i: Undefined variable.
make: *** [foo] Error 1

我发现了这个,但看起来它使用的是bash,而不是tcsh。

简单的回答是,您不应该使用
tcsh
,至少不应该使用makefile。我个人的观点是,现在是时候了,所有的衍生品都被扔进了历史的垃圾桶。但它们肯定在makefile中

在该链接中,请注意,例如:不能使用分号在csh中组合多行构造


除了单行脚本存在的问题外,它们还不能与make的并行jobserver支持配合使用,因为它们在文件描述符上做了一些令人讨厌的事情。

我不知道该错误的确切原因,但我不确定您是否能够使其正常工作。我认为
tcsh
不允许在一行上全部循环,而且make中的行继续支持并没有保持换行符的分隔。不过,您可能可以在较新的make版本中使用
.ONESHELL
来提供帮助。请确保make确实尊重您的
SHELL=…
?只是一个带有
echo$$SHELL
的目标?祝你好运。@EtanReisner:谢谢你教我使用ONESHELL,但在这种情况下它不起作用。谢谢,我同意你的观点,但对于这个项目,我真的必须让它在tcsh中起作用。如果你愿意,你可以否决我的答案,但事实是它不起作用。请参阅我发布的链接。csh语法不能在一行上编写复杂的命令:它需要换行。它也不会接受通过
-c
标志包含换行符的复杂命令,无论出于何种原因,因此ONESHELL无法工作。所以,除非你愿意在一个基本要求上妥协,否则你不会成功。我没有否决你的答案,我同意你关于bash的论点。在我看来,也没有直接的方法来做到这一点。我只需要使用tcsh,所以作为一种解决方法,我最终调用了一个包含foreach循环的tcsh脚本。很有趣!但我必须在tcsh中运行所有程序,而不必使用其他shell的快捷方式。对,所以我认为这是一个练习。我真的认为您需要使用另一种语言来进行迭代。你可以选择任何你喜欢的语言,但它不能是
tcsh
:它的两个内置迭代结构
foreach
while
都必须跨越多行,而
make
将所有配方转换为单行。你可以调用
tcsh
本身吗?在这种情况下,我知道一个解决方案,但这是你的练习,所以我会让你自己去寻找。
SHELL = /usr/bin/tcsh
# but we can't use its loop constructs as they're multi-line

foo: 
    @sh -c 'for i in a b c; do echo $$i; done'