首页 > 解决方案 > 使用 make 运行命令与直接在 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

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

标签: bashdockermakefile

解决方案


您正在运行相同的命令,但在不同的 shell 中。您的交互式 shell 可能是bash. 但是外壳 make 使用的是/bin/shPOSIX 标准外壳(通常)。

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

在我的系统上:

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

bash$ /bin/sh

$ echo foo=~
foo=~

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


推荐阅读