Вызов bash псевдонимов в сценариях Fabric

У меня есть псевдонимы в файле ~/.bash_aliases на удаленном сервере ubuntu. Файл загружается стандартным способом из файла ~/.bashrc, например:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Этот файл ~/.bashrc загружается (также стандартным образом) из файла ~/.profile, который выглядит следующим образом:

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    source ~/.bashrc
    echo ".profile loaded .bashrc"
  fi
fi
mesg n

Я обнаружил, что мои псевдонимы недоступны в моих командах по ткани, например. когда я делаю это в ткани script:

run("aliased_command")

Я получаю этот вывод:

run: aliased_command
out: .profile loaded .bashrc
out: /bin/bash: aliased_command: command not found
Fatal error: run() encountered an error (return code 127) while executing 'aliased_command'

Теперь мне удалось воспроизвести это вне ткани, войдя на сервер с помощью ssh и выполнив:

~# /bin/bash -l -c aliased_command 

из оболочки (n.b. /bin/bash -l -c используется по умолчанию, см. здесь) Я получаю тот же вывод:

.profile loaded .bashrc:
/bin/bash: aliased_command: command not found

После честного поиска по смежным темам я где-то читал, что псевдонимы не экспортируются для неинтерактивных оболочек, и затем мне удалось исправить это, используя /bin/bash -l -c -i (-i устанавливает bash в интерактивный режим).

Затем я добавил в файл fabfile.py следующее:

env.shell = "/bin/bash -l -c -i" 

Теперь я могу использовать псевдонимы в своих командах по ткани... просто отлично!


Итак, мои вопросы:

  • Есть ли проблемы с этим решением? Если да, что мне делать?

  • Есть ли у кого-нибудь проблемы с запуском псевдонимов в своих файлах?

  • Есть ли очевидная причина, почему у меня может быть эта проблема, а другие - нет?

  • Может ли кто-нибудь указать мне ссылки и т.д., которые описывают эту проблему и разрешение? А также объясните, как они их нашли...:)

Ответ 1

Вот быстрый ответ на главный вопрос, чтобы сохранить кого-то, читающего мой длинный вопрос, просто добавить

env.shell = "/bin/bash -l -i -c" 

в файл fabfile.py, и вы должны иметь возможность использовать псевдонимы в ваших командах ткани просто отлично!

Ответ 2

Да, вы совершенно правы, что по умолчанию псевдонимы не расширяются оболочкой bash в неинтерактивном сеансе.

См. раздел по псевдониму на странице руководства: http://linux.die.net/man/1/bash

Псевдонимы не расширяются, если оболочка не является интерактивной, если только Опция оболочки expand_aliases устанавливается с помощью shopt (см. описание магазин под командами SHELL BUILTIN ниже).

Итак, чтобы это произошло на неинтерактивном сеансе, включите это в свой .profile.

shopt -s expand_aliases

Это сделает псевдонимы доступными в неинтерактивном сеансе и ваших сценариях, не прибегая к интерактивным сеансам.

Ответ 3

Я подозреваю, что аргументация поведения bash не экспортирующих псевдонимов заключается в том, что псевдонимы предназначены в первую очередь для обеспечения механизма для интерактивных пользователей оболочки для определения быстрых сокращений или сокращений. В ваших сценариях вы должны использовать полные команды (т.е. ls -l вместо ll) для удобства чтения. Не заставляйте людей изучать все ваши псевдонимы, чтобы читать ваш источник проекта. Если ваши псевдонимы действительно так важны, подумайте о том, чтобы сделать их автономными сценариями оболочки или, по крайней мере, функциями оболочки. Я думаю, вам будет крайне редко использовать псевдонимы в неинтерактивном исходном коде, и, возможно, вам следует пересмотреть свою реализацию.