Intereting Posts
Как переместить содержимое папки в текущую папку? Невозможно обновить openSUSE Leap 42.2 до 42.3 Почему я не вижу пакеты при прослушивании моего ftp-порта с помощью tcpdump на localhost? Centos7 на NUC приостанавливается при нажатии кнопки питания Установка RHEL для многократной загрузки с Windows и двумя другими дистрибутивами Linux Как сравнить различные команды обработки текста и узнать наиболее быстрый? Как возобновить процесс из SSH-соединения? Почему я не могу удалить «.». каталог? Установка Oracle Java 8 Загрузка с раздела жесткого диска. Update-grub? Могу ли я переместить существующую установку Debian на RAID5? Как показать текущую версию во время обновления / проверки обновлений dnf GCC / G ++ компилирует код в общую библиотеку вместо исполняемого файла Может ли proxyCommand ssh_config выполнить локальную команду перед подключением к удаленному компьютеру? Команда tshark для нахождения MAC указанной сети

человек игнорирует псевдоним

В Bash у меня есть псевдоним (для запуска nvim при nvim vim ). Но когда я nvim man vim я получаю человека за vim , а не nvim . Сорт имеет смысл, но, конечно, то, что я действительно хочу, это «руководство для того, что я получаю, если я запускаю vim в оболочке или из сценария», а не «руководство для программы, которую я не использую». Есть ли способ настроить псевдонимы или человека для работы таким образом, или я ожидал, что буду помнить / искать псевдонимы каждый раз, когда я запускаю человека, чтобы убедиться, что я ищу информацию о правильной версии правильного приложения?

Нет, man не может реально найти все ваши псевдонимы и служить man-странице программы, которую вы наложили. Вместо этого вы можете создать другой псевдоним для man-страницы:

 alias manvim="man nvim" 

В bash вы можете использовать type vim для поиска того, что происходит, когда вы вводите vim в vim строке. Таким образом, вы можете заменить man на функцию оболочки, которая проверяет его аргумент и «делает правильную вещь».

 932% type ls ls is hashed (/bin/ls) 933% type vim vim is aliased to `nvim' 

Поскольку вы можете видеть, что вывод type потребует немного разбора и зависящей от регистра логики, но для простых случаев это, конечно же, не имеет большого значения. Расширение псевдонимов может состоять из более чем одного слова (например, I alias lf to ls -AF ), но это также легко обрабатывать.

Это становится сложнее, если псевдоним является конвейером (я бы, вероятно, покажу man-страницу для первой команды и надеюсь на лучшее), и безнадежно, если ваша команда – это функция оболочки, а не псевдоним. Поэтому я распаковывал псевдонимы и передавал все остальное man без изменений. Вот доказательство концепции (поддерживается только один аргумент, и нет вариантов для man ):

 function man { # Find out if the command is an alias, an executable, etc. local cmd p=$(type $1) case `set $p; echo $3` in aliased) cmd=($(set `command alias $1`; echo $2 | sed "s/.*='\([^ ]*\).*/\1/"));; *) cmd=$1;; esac command man $cmd } 

Определите это, и man vim будет искать ваш псевдоним и покажет вам nvim для nvim , как вы просите.

Если оболочка обрабатывает псевдонимы таким образом:

 $ type vim vim is aliased to `nvim' $ type -t vim alias 

затем попробуйте это. Следующая функция оболочки проверяет, является ли ее аргумент псевдонимом. Если это так, он выберет первое пустое разделительное слово псевдонима и запустит man .

 man() { cmd="$1" if [ "$(type -t "$cmd")" == "alias" ] then cmd=$(type "$cmd" | sed -e 's/.*`//' -e "s/[ '].*//") fi command man $cmd } 

Более комплексное решение будет включать в себя $IFS вместо того, чтобы просто искать пустое и разрешать псевдонимы, содержащие ` и ' .

Это плохая идея. Можно использовать функцию оболочки, которая может или не может найти команду aliased. Вместо этого я почти всегда не переопределяю имя по умолчанию для вещей, особенно, чтобы не заставить команду запускать совсем другую команду. Слишком много граблей, чтобы наступить. Учитывая это предупреждение, в ZSH эта функция может выглядеть примерно так:

 # test aliases, for testing # simple no args alias emacs=ls # with flags; need to pick first word and hope that's a command... alias nano='ls -al' # and oops there's also the ENV prefix form... alias notepad='ASDF=blah ls -F' # and also be sure to test with something-that-is-not-an-alias ... # TODO call this `man` to actually override the man function crazyman { local -a cmd args # one may simply type `man ... foo` or there could also be multiple # man pages to be viewed `man ... foo bar` so must iterate over all # the hopefully-not-options-or-section-names arguments and try alias # lookups and all such... `man ls -w` may also be legal depending on # the getops, by the way. while :; do if [[ -n $1 ]]; then while :; do # try to skip over `man 1 foo` or `man -w foo` forms to find what # is hopefully the foo command # # TODO 'n' section for TCL complicated as there could also be a # 'man n' command alongside "man n expr" or whatnot; this assumes # there is no 'man n' page that would ever be looked up. Other # non-numeric-prefixed man section names may also need to be # handled here, depending on the vendor... if [[ $1 =~ "^[0-9-]|^n$" ]]; then args+=($1) shift else break fi done cmd=(${(z)aliases[$1]}) if (( #cmd )); then # aliases might be simple foo='bar ...' or more complicated # foo='ENV=asdf ... bar ...' where we need to dig to try to find # the bar command, and perhaps other complications as well :/ # I did say this was a bad idea... while :; do if [[ $cmd[1] =~ "=" ]]; then shift cmd else break fi done args+=($cmd[1]) else args+=($1) fi shift else break fi done command man $args } 

С помощью command man $args вместо этого заменяется print -l command man $args , некоторые ручные тесты (правильные модульные тесты были бы очень полезны, учитывая количество краевых случаев в приведенном выше коде):

 % crazyman emacs command man ls % crazyman nano command man ls % crazyman notepad command man ls % crazyman notepad nano command man ls ls % crazyman nosuchalias command man nosuchalias % 

Портирование этого кода на другие оболочки, оставленные как упражнение для чтения. Или, упростите и не используйте этот код, учитывая сложность не очень большого выигрыша.