使看到的路径与帐户的 .bashrc 配置的路径不同



我想从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/**是像bashzsh这样的shell的非标准功能,在make食谱中不会做任何特别的事情。这和写lib/*是一样的

你可以强制make使用不同于/bin/sh的shell:

SHELL := /bin/bash
例如,将

放到makefile中,但是这会使它的可移植性降低(如果这是个问题)。

相关内容

  • 没有找到相关文章

最新更新