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-файлу, например, но это делает его менее переносимым (если это проблема).