make 看到的 PATH 与帐户的 .bashrc 配置的 PATH 不同
Posted
技术标签:
【中文标题】make 看到的 PATH 与帐户的 .bashrc 配置的 PATH 不同【英文标题】:make sees different PATH than account's .bashrc-configured PATH 【发布时间】:2014-09-07 02:21:49 【问题描述】:我想从 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 收到的 PATH
与我的普通 Bash shell 不同。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:尝试使用$HOME
,而不是~
:
export PATH="$PATH:$HOME/.cabal/bin"
~
-means-home-directory 功能在所有 shell 中的所有路径名中均不受支持。当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,但这会降低它的可移植性(如果这是一个问题)。
【讨论】:
感谢疯狂科学家!以上是关于make 看到的 PATH 与帐户的 .bashrc 配置的 PATH 不同的主要内容,如果未能解决你的问题,请参考以下文章
"make_path" is not exported by the File::Path modul
您的 PATH 中似乎没有“make”或“gmake” - MinGW32(Windows)