Проблема в том, что вы пытаетесь запустить псевдоним в неинтерактивной оболочке. Когда вы запускаете команду ssh user @ computer
, команда
запускается не интерактивно.
Неинтерактивные оболочки не читают псевдонимы (из man bash):
Псевдонимы не раскрываются, если оболочка не интерактивна, если только параметр оболочки expand_aliases не установлен с помощью shopt (см. Описание покупал под ВСТРОЕННЫМИ КОМАНДАМИ ОБОЛОЧКИ ниже).
Это сработает, если вы снова запустите ее вручную, потому что последняя команда bash
запускает интерактивную оболочку, поэтому теперь доступны ваши псевдонимы.
В качестве альтернативы вы можете запустить интерактивную оболочку ( bash -i
) вместо простой оболочки входа ( bash -l
) на удаленном компьютере для запуска вашего псевдонима:
ssh user@remote_computer -t 'bash -ic "my_alias;bash"'
Это кажется очень сложным подходом. Вы не объяснили, почему именно вам это нужно, но рассмотрите следующие альтернативы:
Просто запустите обычную интерактивную оболочку входа в систему на удаленном компьютере и выполните команду вручную:
user @ local $ ssh user @ remote {{ 1}} user @ remote $ my_alias
Если вы хотите, чтобы этот псевдоним всегда запускался при подключении к этому компьютеру, отредактируйте ~ / .profile
(или ~ /.bash_profile
, если есть) удаленного компьютера и добавьте эту строку в конце:
my_alias
Потому что ~ / .profile
читается каждый раз, когда запускается оболочка входа в систему (например, каждый раз, когда вы подключаетесь через ssh
), что приводит к запуску my_alias
при каждом подключении.
Обратите внимание, что по умолчанию оболочки входа в систему читают ~ /.profile
или ~ / .bash_profile
и игнорируйте ~ / .bashrc
. Некоторые дистрибутивы (например, Debian и его производные и Arch), такие как Ubuntu, имеют по умолчанию ~ / .profile
или ~ / .bash_profile
исходный код файлов ~ / .bashrc
, что означает, что ваши псевдонимы, определенные в ~ / .bashrc
, также будут доступны в оболочке входа в систему. Это верно не для всех дистрибутивов, поэтому вам, возможно, придется вручную отредактировать свой ~ / .profile
, чтобы получить его исходный код ~ / .bashrc
. Также обратите внимание, что если существует ~ / .bash_profile
, ~ / .profile
будет игнорироваться bash.
Основываясь на ответе Адефона , я написал полное удаление -вместо source
и .
.
Это было непросто из-за встроенного поведения передачи $@
, если аргументы не заданы.
Необходимые псевдонимы указаны в комментариях.
compile-source-file
:
# This file needs to be `sourced` to ensure a drop-in behaviour for `source` or `.`
# The shell passess "$@" to source if no arguments are given after the file to be sourced.
# Works in bash.
# Required aliases are:
# alias source='builtin source compile-source-file source "$#" "$@"'
# alias .='builtin. compile-source-file. "$#" "$@"'
# zsh: compile functions before sourcing
# This function expects to be called with:
# $1 builtin to use, either `.` or `source`.
# $2 file to source
# $3... arguments to pass to sourced file
function compile_then_source () {
local method=$1 file=$2; shift 2; local args=("$@")
# ${var@Q} gives value of var quoted in a format that can be reused as input
[[ $BASH_VERSION ]] && { eval builtin "$method" "$file" "${args@Q}"; return $?; }
if [[ ! $file.zwc -nt $file ]]; then
# Use canonical pathname for zrecompile's happiness
if [[ -r $file && -w ${file:h} ]]; then zcompile "${file:P}"; fi
fi
eval builtin "$method" "$file" "${(q)args[@]}"
}
function main () {
local use_builtin=$1 # '.' or 'source'
local num_args=$2 # Number of elements in calling shell's $@, which follow
shift 2;
local wrapper_args=("$@")
wrapper_args=("${wrapper_args[@]:0:$num_args}")
shift "$num_args"
local file=$1; shift;
# Now $@ is the arguments passed after the file to be soured
if [[ $# -ge 1 ]]; then # arguments were passed
use_args=("$@")
else # use $@ from the wrapper args
use_args=("${wrapper_args[@]}")
fi
compile_then_source "$use_builtin" "$file" "${use_args[@]}"
}
main "$@"
unset -f main compile_then_source