每个循环制作一个子进程?

时间:2013-05-02 13:46:56

标签: makefile child-process

让我先写一个快速的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吗?

1 个答案:

答案 0 :(得分:1)

为规则中的每个命令生成一个新进程。由于for循环是一个命令,因此只能获得一个进程。

查看Recipe Execution

修改

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打印出来 。目录