我想从ShellCheck调用Makefile,这是一个用于分析shell脚本的Haskell程序。
当我通过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这使我能够从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)我认为那是没有收到相同的PATH与我的普通巴什壳。我怎么才能解决这个问题?
发布于 2014-07-16 14:14:22
尝试使用$HOME,而不是~
export PATH="$PATH:$HOME/.cabal/bin"在所有shell中的路径名中都不支持~-means-home-目录特性。当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来说,这使得它的可移植性更低(如果这是一个问题)。
https://stackoverflow.com/questions/24782765
复制相似问题