通过 Makefile 向 shell 发送命令

Lug*_*ino 4 shell make shell-script

我正在构建一个Makefile自动启动 docker on 的osx.

在启动结束时,docker 需要在 shell 上启动此命令以配置 shell: eval "$(docker-machine env dev)"

问题是,如果我尝试在 Makefile 上运行它,这对 shell 没有影响。
事实上,如果启动:
make start然后make status我从docker那里得到错误。

这是我的 Makefile:

CURRENT_DIRECTORY := $(shell pwd)

start:
    @sh run.sh -d
    @eval $(docker-machine env dev)

start-compose:
    @docker-compose up -d

clean:
    @docker-compose rm --force

stop:
    @docker-compose stop

shutdown:
    @docker-compose stop
    @docker-machine stop dev

build:
    @docker-compose build

status:
    @docker-compose ps

cli:
    @docker-compose run --rm web bash

log:
    @docker-compose logs web

logall:
    @docker-compose logs

restart:
    @docker-compose stop web
    @docker-compose start web

restartall:
    @docker-compose stop
    @docker-compose start

.PHONY: clean start start-compose stop status shutdown build cli log logall restart restartall
Run Code Online (Sandbox Code Playgroud)

有没有办法eval "$(docker-machine env dev)"在 Makefile 上启动命令并且会影响 shell?

APr*_*mer 13

  1. 如果您没有要跟踪的依赖项,那么 Make 可能不是正确的工具。

  2. Make 为每个命令(或某些版本中的每个规则)启动一个 shell,如果您需要配置 shell,则需要配置每个实例。

  3. 进程不可能修改其父进程。因此,如果您希望 Make 修改执行它的 shell,那么如果不使用与 docker 相同的技巧,这是不可能的。

  4. 正如$Make 解释的那样,要将其传递给 shell,需要对其进行转义。

  5. 这是一个可行的结构(请注意,我将规则合并到一个命令中),但我再次认为 Make 不是处理此类事情的正确工具,而且我对 docker 一无所知,因此我可能会错过一些相关的内容。

    start:
        @sh run.sh -d; \
        echo $$(docker-machine env dev) > ./docker-config
    
    start-compose:
        @eval $$(cat ./docker-config); \
        docker-compose up -d
    
    clean:
        @eval $$(cat ./docker-config); \
        docker-compose rm --force
    
    stop:
        @eval $$(cat ./docker-config); \
        docker-compose stop
    
    shutdown:
        @eval $$(cat ./docker-config); \
        docker-compose stop ; \
        docker-machine stop dev
    
    Run Code Online (Sandbox Code Playgroud)