我想从Makefile
调用ShellCheck,一个用于检查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
。我该如何解决这个问题?
尝试使用$HOME
,而不是~
:
export PATH="$PATH:$HOME/.cabal/bin"
在所有shell中的路径名中不支持~
-means-home-directory特性。当make
运行一个食谱时,它不使用用户的shell(这将是一个灾难!),它总是使用/bin/sh
。
在一些系统上(特别是基于Debian/ubuntu的GNU/Linux发行版),默认的/bin/sh
不是bash,而是dash。Dash不支持在PATH
变量中扩展~
。
一般来说,应该保留~
作为命令行上的简写。但在脚本等中,您应该总是倾向于写出$HOME
。
埃塔:
此外,双星语法lib/**
是像bash
和zsh
这样的shell的非标准功能,在make
食谱中不会做任何特别的事情。这和写lib/*
是一样的
你可以强制make使用不同于/bin/sh
的shell:
SHELL := /bin/bash
例如,将放到makefile中,但是这会使它的可移植性降低(如果这是个问题)。