Как поместить в файл временные псевдонимы?

Это было бы сложно реализовать на этапе обратного поиска.

alias g=grep
g foo /etc/passwd
alias g=git
g status

поскольку для обратного поиска необходимо знать, что псевдоним был изменен, информация, которая, в отличие от приведенного выше примера, будет недоступна, если псевдоним был невидим (для функции поиска в истории )изменен через редактирование файла конфигурации и перезапуск оболочки.

Вместо этого может быть более подходящим (, но все еще несколько сложным )записывать каноническую информацию в историю оболочки, поэтому история оболочки из вышеперечисленного вместо этого будет расширена до git или grep в зависимости от псевдонима в пользу во время выполнения команды. Недостаток :вам нужно управлять историей самостоятельно, и вы должны искать по имени команды, а не по псевдониму:

function zshaddhistory() {
  local -a cmd
  local i
  # split using shell parse, see zshexpn(1)
  cmd=(${(z)1})
  if (( $#cmd )); then
    # alias expand or failing that the command
    # NOTE zsh is 1-indexed, not 0-indexed
    cmd[1]=${aliases[$cmd[1]]:-$cmd[1]}
    for (( i = 2 ; i < $#cmd ; i++ )); do
      # look for ; and try to alias expand word following
      if [[ $cmd[$((i-1))] == \; ]]; then
        cmd[$i]=${aliases[$cmd[$i]]:-$cmd[$i]}
      fi
    done
    # (z) adds a trailing ; remove that
    cmd[$#cmd]=()
    # write to usual history location
    print -sr -- $cmd
  fi
  # disable the usual history handling
  return 1
}
alias g='echo wait for godot'

С этой загрузкой:

% exec zsh -l
% ls
...
% uptime
...
% g ; g
wait for godot
wait for godot
% history
    1  ls
    2  uptime
    3  echo wait for godot ; echo wait for godot
    4  history

Это не поддерживает глобальные псевдонимы, которые могут появляться не только в начале строки или после ;. Этот код может иметь другие упущения.

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

   ...
    # (z) adds a trailing ; remove that
    cmd[$#cmd]=()
    cmd+=(\# ${1%%$'\n'})
   ...

что в какой-то момент может потребовать от вас переписать весь код сохранения и -истории -сохранения и поиска в истории в соответствии с вашими конкретными потребностями.

0
30.09.2019, 02:02
1 ответ

Чтобы вставить содержимое файла в текущий сеанс, вам нужно указать источник файла, а не выполнить его.

. my_file

Когда вы только что выполняли файл, псевдонимы устанавливались в подоболочке и, следовательно, не влияли на ваш текущий сеанс.

5
28.04.2021, 23:28

Теги

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