Команда НЕ найдена при вызове изнутри скрипта bash
У меня установлено приложение puppet на моем компьютере с Linux. Он установлен на месте /usr/test/bin/puppet
Вот как .bash_profile
выглядит
export PATH=/usr/test/bin
если я запускаю команду puppet apply
с консоли работает нормально но когда звоню puppet
команда изнутри скрипта bash, она говорит, что команда не найдена
#!/bin/bash
puppet apply x.pp
Любые идеи о том, что не так?
3 ответа
Вы можете попробовать использовать alias
, вот так
в вашем .bash_profile
:
alias puppet='bash puppet.fileextension'
Вы также можете сделать
alias puppet='bash path/to/puppet.fileextension'
что позволит вам запустить скрипт из любой точки терминала.
РЕДАКТИРОВАТЬ:
OP заявил в комментариях, что будут работать две разные системы, и спросил, как проверить путь к файлу bash.
Если вы делаете
#!/bin/bash
runPuppet(){
if [ -e path/to/system1/puppet.fileextension]
then
bash path/to/system1/puppet.fileextension $1 $2
elif [ -e path/to/system2/puppet.fileextension]
then
bash path/to/system2/puppet.fileextension $1 $2
fi
}
runPuppet apply x.pp
и изменить runPuppet
вход на что угодно.
Чтобы уточнить / объяснить:
-e
должен проверить, существует ли файл
$1
& $2
первые два входных параметра, соответственно.
.bash_profile
загружается, только если bash вызывается как оболочка входа в систему (bash -l
или из реального tty), по крайней мере, в дистрибутивах на основе Debian bash в виртуальном tty (например, при использовании xterm
, gnome-terminal
и т. д.) вызывается как интерактивная оболочка.
Интерактивные оболочки загружают конфигурацию из ~/.bashrc
,
man-страница bash:
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
Скрипты не загружают ничего из этого.
Вы можете проверить, какие файлы открываются любой программой с помощью strace
:
strace ./s.sh 2>&1 | grep -e stat -e open
Возможные решения:
Вы можете экспортировать переменную в начале каждого скрипта:
#!/bin/bash export PATH=$PATH:...
Или вы можете получить другой файл с нужными переменными и получить его из любого скрипта, который нуждается в них:
/etc/special_vars.sh:
export PATH=$PATH:...
сценарий:
#!/bin/bash . /etc/special_vars.sh puppet ...
Настройте
PATH
в в~/.bashrc
,~/.bash_profile
а также~/.profile
чтобы пользователь, выполняющий сценарий (подпроцессы будут наследовать переменные среды), имел некоторую гарантию того, что пользователь может запускать сценарий из разных сред и оболочек (некоторые совместимые с bourne оболочки, отличные от bash, загружают~/.profile
)
Может быть экспорт PATH
неправильно?
export PATH=$PATH:/usr/test/bin/puppet