运行 命令与 make 直接在 shell 中给出与 运行 不同的结果

Running command with make gives different result from running it directly in shell

我有一个 Makefile 看起来像这样:

build-docker:
    DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t my-app .

如果我 运行 make build-docker 我得到以下错误:

$ make build-docker
DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t my-app .
could not parse ssh: [default=~/.ssh/id_rsa]: stat ~/.ssh/id_rsa: no such file or directory
make: *** [Makefile:12: build-docker] Error 1

不过,如果我直接在运行命令中shell就运行就好了:

$ DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t my-app .
[+] Building 65.5s (20/20) FINISHED

为什么会这样,我该如何解决?

你们是 运行 同一个命令,但在不同的 shell 中。您的互动 shell 可能是 bash。但是 shell make 使用的是 /bin/sh,这是 POSIX 标准 shell(通常)。

参数中 ~ 的特殊处理是一个 shell 特性:它没有嵌入到 docker 或 ssh 等程序中。而且,它没有在 POSIX 中定义;这是一些 shell 的附加功能,例如 bash.

在我的系统上:

bash$ echo foo=~
foo=/home/me

bash$ /bin/sh

$ echo foo=~
foo=~

为了便于移植,您应该使用完整路径名或 $HOME(请记住,在 make 配方中,您必须将 $ 加倍才能将其从 make 中转义:$$HOME) .