make видит другой путь, отличный от настроенного.bashrc

Я хочу вызвать ShellCheck, программу на Haskell для написания сценариев оболочки, из Makefile,

Когда я устанавливаю 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

Это позволяет мне бежать shellcheck из любого каталога в Bash. Тем не менее, когда я пытаюсь вызвать его из 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 как моя нормальная оболочка Bash. Как я могу это исправить?

1 ответ

Решение

Попробуйте использовать $HOMEне ~:

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

~Функция -means-home-directory не поддерживается в путевых именах во всех оболочках. когда make запускает рецепт, не использует оболочку пользователя (это было бы катастрофой!) /bin/sh всегда.

В некоторых системах (особенно в дистрибутивах GNU/Linux на основе Debian / Ubuntu) по умолчанию /bin/sh это не Баш, а скорее тире. Тире не поддерживает ~ расширяется в PATH переменная.

В общем, вы должны зарезервировать ~ для использования в командной строке как сокращение. Но в сценариях и т. Д. Вы всегда должны предпочитать выписывать $HOME,

ETA:

Кроме того, синтаксис двойной звезды lib/** это нестандартная особенность оболочек, таких как bash а также zsh и не буду делать ничего особенного в make рецепты. Это идентично письму lib/*,

Вы можете заставить make использовать другую оболочку, чем /bin/sh добавляя:

SHELL := /bin/bash

к вашему make-файлу, например, но это делает его менее переносимым (если это проблема).

Другие вопросы по тегам