
Ранее я нашел фрагмент скрипта Bash, с помощью которого можно вывести строку в stderr:
echoerr() { echo "$@" 1>&2; }
echoerr hello world
Он остался в моем буфере обмена, и когда я захотел отредактировать файл (с помощью VIM), я случайно снова вставил этот фрагмент вместо имени файла:
vim echoerr() { echo "$@" 1>&2; }
echoerr hello world
Кажется, он был переназначен echoerr
на vim
:
$ where vim
vim () {
echo "$@" 1>&2;
}
/usr/bin/vim
Кроме того, попытка открыть файл с помощью VIM теперь просто выводит на экран имя файла:
vim path/to/some-file
Печать:
path/to/some-file
Что случилось?(Я запускаю zsh внутри tmux)
решение1
Поскольку zsh
позволяет вам определять функции с несколькими именами. Из man zshmisc
:
function word ... [ () ] [ term ] { list }
word ... () [ term ] { list }
word ... () [ term ] command
where term is one or more newline or ;. Define a function which
is referenced by any one of word. Normally, only one word is
provided; multiple words are usually only useful for setting
traps. The body of the function is the list between the { and
}. See the section `Functions'.
решение2
Вам удалось создать функцию с именем vim()
. Это возможно, поскольку zsh позволяет вам создавать одну функцию с несколькими именами одновременно
% vim dud() { echo ran dud function }
% dud
ran dud function
% vim path/to/some-file
ran dud function
Обратите внимание, как vim()
и dud()
обе были установлены как функции.
Вы можете удалить ошибочную функцию, отменив для нее определение функции следующим образом:
% unset -f vim
Теперь vim path/to/some-file
вам следует открыть свой редактор.