让我先写一个快速的Makefile作为展示:
#!/bin/make -f
folders := $(shell find -mindepth 1 -maxdepth 1 -type d -print)
make_dir:
@mkdir -p "test0"
pwd_test:
@cd "test0" && pwd
@pwd
pwd_all:
@for f in $(folders); do \
cd "$${f}" && pwd; \
pwd; \
cd ..; \
done
首先执行make make_dir
然后查看不同的结果:
➜ so make pwd_test
/data/cache/tmp/so/test0
/data/cache/tmp/so
➜ so make pwd_all
/data/cache/tmp/so/test0
/data/cache/tmp/so/test0
您会在for循环中看到cd ..
。显然,现在cd X && pwd
命令没有子进程生成,而通常就是这种情况。这种行为是特定于我的shell吗?
答案 0 :(得分:1)
为规则中的每个命令生成一个新进程。由于for循环是一个命令,因此只能获得一个进程。
修改强>
makefile中的每一行都有自己的子shell。有的命令
\
告诉make下一行应该是当前行的一部分。
for循环获得自己的子shell的原因是因为make将该行视为
@for f in $(folders); do cd "$${f}" && pwd; pwd; cd ..; done
MadScientist解释得相当好。您可以输入的任何命令 一行中的shell将由make在一个子shell或进程中执行。
如果你在ksh中运行它,ksh将被传递
for f in $(folders); do cd "$${f}" && pwd; pwd; cd ..; done
就可以了
在那个子shell中运行。如果ksh没有实现这个for循环
可能会出错并且make会说该命令返回了一些错误代码。
pwd_test的解释
pwd_test:
@cd "test0" && pwd
@pwd
@cd "test0" && pwd
被视为一行,因此子shell会更新其当前值
工作目录,然后打印出当前工作的内容。
@pwd
在此行生成一个包含旧工作的新子shell
目录(或目录make被称为表单),pwd
打印出来
。目录