2

我想Makefile.

当我通过 安装 ShellCheck 时cabal install,它安装为~/.cabal/bin/shellcheck. 所以,我已经相应地配置了 Bash:

$ cat ~/.bashrc
export PATH="$PATH:~/.cabal/bin"

$ source ~/.bashrc
$ shellcheck -V
ShellCheck - shell script analysis tool
version: 0.3.4
license: GNU Affero General Public License, version 3
website: http://www.shellcheck.net

这使我能够shellcheck从 Bash 中的任何目录运行。但是,当我尝试从 Makefile 调用它时,make找不到shellcheck.

$ cat Makefile
shlint:
    -shlint lib/

shellcheck:
    -shellcheck lib/**

lint: shlint shellcheck

$ make shellcheck
shellcheck lib/**
/bin/sh: 1: shellcheck: not found
make: [shellcheck] Error 127 (ignored)

我认为 make 与PATH我的普通 Bash shell 不同。我怎样才能解决这个问题?

4

1 回答 1

1

尝试使用$HOME,而不是~

export PATH="$PATH:$HOME/.cabal/bin"

-means-home-directory 功能在所有 shell 中的~所有路径名中均不受支持。当make运行一个配方时,它不使用用户的外壳(那将是一场灾难!)它/bin/sh总是使用。

在某些系统(尤其是基于 Debian/Ubuntu 的 GNU/Linux 发行版)上,默认/bin/sh不是 bash,而是 dash。Dash 不支持~PATH变量中展开。

通常,您应该保留~在命令行上作为简写使用。但是在脚本等方面,你应该总是喜欢写出$HOME.

预计到达时间:

此外,双星语法lib/**是 shell 的非标准功能,例如bashandzsh不会在make配方中做任何特殊的事情。它与写作相同lib/*

您可以强制 make 使用不同的 shell,而不是/bin/sh添加:

SHELL := /bin/bash

例如,到您的makefile,但这会降低它的可移植性(如果这是一个问题)。

于 2014-07-16T14:14:22.327 回答