make看到与帐户的.bashrc配置的PATH不同的PATH

时间:2014-07-16 13:58:19

标签: unix path makefile environment-variables shellcheck

我想从Makefile调用ShellCheck,一个用于linting shell脚本的Haskell程序。

当我通过cabal install安装ShellCheck时,它安装为~/.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

这使我可以从Bash中的任何目录运行shellcheck。但是,当我尝试从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没有收到与普通Bash shell相同的PATH。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

尝试使用$HOME,而不是~

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

所有shell中的路径名都不支持~ - means-home-directory功能。当make运行配方时,它不会使用用户的shell(这将是一场灾难!)它始终使用/bin/sh

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

通常,您应该保留~作为速记在命令行上使用。但在脚本等方面,你应该总是更愿意写出$HOME

ETA:

此外,双星语法lib/**bashzsh等shell的非标准功能,在make食谱中不做任何特殊操作。这与写lib/*

相同

您可以通过添加以下内容强制make使用与/bin/sh不同的shell:

SHELL := /bin/bash
例如,

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