Я знаю, что могу выполнить функцию через SSH на удаленном сервере, например:
$ ssh remote_server "$(declare -f cool_function); cool_function"
У меня также есть несколько псевдонимов, которые я хотел бы выполнять на удаленных серверах, не определяя их в каком-либо файле, полученном на удаленных серверах, поэтому я могу иметь все свои функции и псевдонимы в одном месте и использовать их на любом удаленном SSH-сервере.
Я думал, это сработает:
$ alias very_cool_alias='echo A very cool alias'
$ very_cool_alias
A very cool alias
$ ssh remote_server "$(alias very_cool_alias);very_cool_alias"
bash: very_cool_alias: command not found
Хотя, если я проверю псевдонимы, псевдоним есть:
$ ssh remote_server "$(alias very_cool_alias);alias"
alias very_cool_alias='echo A very cool alias'
Почему работает функция, но не псевдоним, хотя он передается на удаленный SSH-сервер, как показывает последний пример? Есть идеи, что мне не хватает или как я могу этого добиться?
Я также пробовал установить опцию expand_aliases, но все равно получаю command not found
:
ssh remote_server "shopt -s expand_aliases;$(alias some_alias);some_alias"
Руководство Shell говорит нам:
Псевдонимы не раскрываются, если оболочка не интерактивна, если только параметр оболочки expand_aliases не установлен с помощью
shopt
...
Однако он также упоминает
Правила, касающиеся определения и использования псевдонимов, несколько сбивают с толку. Bash всегда читает как минимум одну полную строку ввода перед выполнением любой из команд в этой строке. Псевдонимы раскрываются при чтении команды, а не при ее выполнении.
Это можно проверить локально: (ssh вызывает bash -c
удаленно):
$ bash -c "shopt -s expand_aliases; shopt expand_aliases;alias x=ls; x"
expand_aliases on
bash: x: command not found
Это действительно помогает сделать его многострочным:
$ bash -c "shopt -s expand_aliases; alias x='echo y'
> x"
y
И это также работает с ssh.
Вероятно, вам следует синхронизировать файлы .profile, .bash_profile и / или .bashrc, содержащие ваши любимые псевдонимы. Я предлагаю для удобства использовать rsync.