Команда НЕ найдена при вызове изнутри скрипта 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

Возможные решения:

  1. Вы можете экспортировать переменную в начале каждого скрипта:

    #!/bin/bash
    export PATH=$PATH:...
    
  2. Или вы можете получить другой файл с нужными переменными и получить его из любого скрипта, который нуждается в них:

    /etc/special_vars.sh:

    export PATH=$PATH:...
    

    сценарий:

    #!/bin/bash
    . /etc/special_vars.sh
    puppet ...
    
  3. Настройте PATH в в ~/.bashrc, ~/.bash_profile а также ~/.profile чтобы пользователь, выполняющий сценарий (подпроцессы будут наследовать переменные среды), имел некоторую гарантию того, что пользователь может запускать сценарий из разных сред и оболочек (некоторые совместимые с bourne оболочки, отличные от bash, загружают ~/.profile)

Может быть экспорт PATH неправильно?

export PATH=$PATH:/usr/test/bin/puppet
Другие вопросы по тегам