`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 "$@"
}