这一行在make文件`DOCKER:=$(shell命令-v DOCKER)中的含义`

这一行在make文件`DOCKER:=$(shell命令-v DOCKER)中的含义`,shell,makefile,Shell,Makefile,$shell命令-v docker命令是什么意思?它正在生成文件中使用 我在github存储库中看到了这一点,我正在努力理解它 看起来它正在用一个命令设置一个变量来测试是否安装了docker,如果没有,则停止构建,问题是我没有安装命令,我尝试在ubuntu中安装命令,但它找不到,在internet上查看如何安装这个commad命令似乎很困难,因为它的名称,如何在linux/ubuntu中安装命令并没有带来任何有用的东西,也在makefile上搜索这个命令,试图获得一些线索,但到目前为止什么都没有

$shell命令-v docker命令是什么意思?它正在生成文件中使用

我在github存储库中看到了这一点,我正在努力理解它

看起来它正在用一个命令设置一个变量来测试是否安装了docker,如果没有,则停止构建,问题是我没有安装命令,我尝试在ubuntu中安装命令,但它找不到,在internet上查看如何安装这个commad命令似乎很困难,因为它的名称,如何在linux/ubuntu中安装命令并没有带来任何有用的东西,也在makefile上搜索这个命令,试图获得一些线索,但到目前为止什么都没有

运行build命令似乎很有效,因为它构建了映像,是的,我已经安装了docker,但仍然在终端make:command:command not found中收到该消息

有什么想法吗

使生成输出结构化:

$ make build                                                                                                                                                                                   
make: command: Command not found                                                                                                                                                               
make: command: Command not found                                                                                                                                                               
docker build -t codelytv/typescript-ddd-skeleton:dev .                                                                                                                                         
Sending build context to Docker daemon  1.023MB 
.....
这是生成文件:

.PHONY = default deps build test start clean start-database

IMAGE_NAME := codelytv/typescript-ddd-skeleton
SERVICE_NAME := app

# Test if the dependencies we need to run this Makefile are installed
DOCKER := $(shell command -v docker)
DOCKER_COMPOSE := $(shell command -v docker-compose)
deps:
ifndef DOCKER
    @echo "Docker is not available. Please install docker"
    @exit 1
endif
ifndef DOCKER_COMPOSE
    @echo "docker-compose is not available. Please install docker-compose"
    @exit 1
endif

default: build

# Build image
build:
    docker build -t $(IMAGE_NAME):dev .

# Run tests
test: build
    docker-compose run --rm $(SERVICE_NAME) bash -c 'npm run build && npm run test'

# Start the application
start: build
    docker-compose up $(SERVICE_NAME) && docker-compose down

# Clean containers
clean:
    docker-compose down --rmi local --volumes --remove-orphans

# Start mongodb container in background
start_database:
    docker-compose up -d mongo

这意味着编写这个makefile的人没有足够小心地以可移植的方式编写它

命令是shell的一部分,这就是为什么如果在GNU make手册中查找它,您将看不到它。不仅如此,它还是bashshell的一部分:它不是POSIX sh标准命令。bash手册页上说:

   command [-pVv] command [arg ...]
          Run  command  with  args  suppressing  the normal shell function
          lookup.  Only builtin commands or commands found in the PATH are
          executed.
基本上,运行命令docker。。。表示忽略任何名为docker的shell别名或函数,并且只运行实际的docker命令

然而,GNU make总是运行/bin/sh作为它的shell,包括菜谱和$shell。。。功能

因此,如果您在诸如Red Hat、CentOS或Fedora GNU/Linux之类的系统上,其中/bin/sh是指向bash shell的链接,那么上面的命令将起作用

但是,如果您在Debian或Ubuntu GNU/Linux等系统上,其中/bin/sh是指向更简单的POSIX shell(如dash)的链接,那么上述命令将无法工作

实际上,这是不需要的,因为无论如何,在shell中都不会定义任何shell别名或函数来进行调用。但是,如果作者希望在其makefile中使用bash shell功能并允许它们工作,他们还需要告诉make使用bash作为其shell,方法是将以下内容添加到其makefile中:

SHELL := /bin/bash

当然,这假设用户在他们的系统上有一个/bin/bash,但是…

这意味着编写这个makefile的人没有足够小心地以可移植的方式编写它

命令是shell的一部分,这就是为什么如果在GNU make手册中查找它,您将看不到它。不仅如此,它还是bashshell的一部分:它不是POSIX sh标准命令。bash手册页上说:

   command [-pVv] command [arg ...]
          Run  command  with  args  suppressing  the normal shell function
          lookup.  Only builtin commands or commands found in the PATH are
          executed.
基本上,运行命令docker。。。表示忽略任何名为docker的shell别名或函数,并且只运行实际的docker命令

然而,GNU make总是运行/bin/sh作为它的shell,包括菜谱和$shell。。。功能

因此,如果您在诸如Red Hat、CentOS或Fedora GNU/Linux之类的系统上,其中/bin/sh是指向bash shell的链接,那么上面的命令将起作用

但是,如果您在Debian或Ubuntu GNU/Linux等系统上,其中/bin/sh是指向更简单的POSIX shell(如dash)的链接,那么上述命令将无法工作

实际上,这是不需要的,因为无论如何,在shell中都不会定义任何shell别名或函数来进行调用。但是,如果作者希望在其makefile中使用bash shell功能并允许它们工作,他们还需要告诉make使用bash作为其shell,方法是将以下内容添加到其makefile中:

SHELL := /bin/bash
当然,这假设用户的系统上有一个/bin/bash,但是