`ssh foo"<команда /> "` не загружает удаленные псевдонимы?

Резюме: почему это не удается

$ ssh foo 'R --version | head -n 1'
bash: R: command not found

но это удается

$ ssh foo 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh foo 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux86_64/bin/R'
$ ssh foo '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

? подробности:

Я (без root) пользователь на 2 кластера. Один использует модули среды, так что любой данный сервер в этом кластере может предоставить (через module add) в значительной степени те же ресурсы. К другому кластеру, над которым я, к сожалению, тоже должен работать, серверы управляются индивидуально, поэтому я привык, например,

EXEC_NAME='whatever'
for S in 'foo' 'bar' 'baz' ; do
  ssh ${SERVER} "${EXEC_NAME} --version"
done

Это работает нормально для пакетов, установленных нормально / последовательно, но часто (по неизвестным мне причинам) пакеты не являются: например (сравните псевдоним ниже с псевдонимом выше),

$ ssh bar 'R --version | head -n 1'
bash: R: command not found
$ ssh bar 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh bar 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux/bin/R'
$ ssh bar '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

Использование псевдонимов хорошо справляется с этими различиями при установке, когда я в интерактивном режиме выполняю оболочку на сервере, но завершается неудачно, когда я пытаюсь создавать сценарии команд ssh (как описано выше); т.е.

# interactively
$ ssh foo
...
foo> R --version

называет мой псевдоним для R на удаленном хосте =foo, но

# scripting
$ ssh foo 'R --version'

не делает. Что мне нужно сделать, чтобы сделать ssh foo "<command/>" загрузить мои псевдонимы на удаленном хосте?

2 ответа

Решение

От bash страница руководства:

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

Вам нужно shopt -s expand_aliases в вашем пульте .bashrcи проверьте, что те .bashrc обрабатываются, когда неинтерактивны; по умолчанию .bashrc для вашего дистрибутива может быть включена проверка на досрочное прекращение, когда он неинтерактивный, например, Ubuntu использует

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Эндрю ответ объяснил причину. Я даю только еще одно решение:

Вместо того, чтобы использовать aliasesиспользовать их function equivalents,

Например:

Вместо того, чтобы использовать:alias ll='ls -lah'

Использовать этот:

function ll{ ls -lah "$@" }

Другие вопросы по тегам