运行 命令与 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
) .
我有一个 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
) .