Вызов 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
) для удобства чтения. Не заставляйте людей изучать все ваши псевдонимы, чтобы читать ваш источник проекта. Если ваши псевдонимы действительно так важны, подумайте о том, чтобы сделать их автономными сценариями оболочки или, по крайней мере, функциями оболочки. Я думаю, вам будет крайне редко использовать псевдонимы в неинтерактивном исходном коде, и, возможно, вам следует пересмотреть свою реализацию.