Автоматически используйте `.zwc` версию ` исходного файла`d

Проблема в том, что вы пытаетесь запустить псевдоним в неинтерактивной оболочке. Когда вы запускаете команду ssh user @ computer , команда запускается не интерактивно.

Неинтерактивные оболочки не читают псевдонимы (из man bash):

Псевдонимы не раскрываются, если оболочка не интерактивна, если только параметр оболочки expand_aliases не установлен с помощью shopt (см. Описание покупал под ВСТРОЕННЫМИ КОМАНДАМИ ОБОЛОЧКИ ниже).

Это сработает, если вы снова запустите ее вручную, потому что последняя команда bash запускает интерактивную оболочку, поэтому теперь доступны ваши псевдонимы.

В качестве альтернативы вы можете запустить интерактивную оболочку ( bash -i ) вместо простой оболочки входа ( bash -l ) на удаленном компьютере для запуска вашего псевдонима:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

Это кажется очень сложным подходом. Вы не объяснили, почему именно вам это нужно, но рассмотрите следующие альтернативы:

  1. Просто запустите обычную интерактивную оболочку входа в систему на удаленном компьютере и выполните команду вручную:

     user @ local $ ssh user @ remote {{ 1}} user @ remote $ my_alias 
     
  2. Если вы хотите, чтобы этот псевдоним всегда запускался при подключении к этому компьютеру, отредактируйте ~ / .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.

3
08.07.2018, 14:04
1 ответ

Основываясь на ответе Адефона , я написал полное удаление -вместо 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
1
27.01.2020, 21:25

Теги

Похожие вопросы