남자들은 별명을 무시한다

남자들은 별명을 무시한다

nvimBash에는 (입력할 때 실행되는) 별칭이 있습니다 vim. 하지만 내가 이것을 입력할 때 man vim내가 받는 사람들은 vim, 아니 입니다 nvim. 말이 되지만, 물론 내가 정말로 원하는 것은 "사용하지 않는 프로그램에 대한 매뉴얼"이 아니라 "셸이나 스크립트에서 vim을 실행할 때 얻는 매뉴얼"입니다. 별칭이나 man을 이런 방식으로 작동하도록 구성할 수 있는 방법이 있습니까? 아니면 올바른 응용 프로그램의 올바른 버전에 대한 정보를 찾고 있는지 확인하기 위해 man을 실행할 때마다 별칭을 기억/조회하고 싶습니까?

답변1

아니요, man실제로 모든 별칭을 찾고 별칭을 지정한 프로그램에 대한 맨페이지를 제공할 수 있는 방법은 없습니다. 맨페이지에 다른 별칭을 설정하면 됩니다.

alias manvim="man nvim"  

답변2

Bash에서는 프롬프트에 입력할 때 무슨 일이 일어나는지 type vim알아내는 데 사용할 수 있습니다 . 따라서 인수를 확인하고 "올바른 작업을 수행"하는 쉘 함수로 vim이를 대체할 수 있습니다 .man

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

보시다시피 의 출력에는 type일부 구문 분석 및 대소문자 종속 논리가 필요하지만 단순한 경우에는 확실히 큰 문제가 아닙니다. 별칭 확장에는 여러 단어(예: I 별칭 lfto ) 가 포함될 수 있지만 ls -AF이 역시 처리하기 쉽습니다.

별칭이 파이프인 경우 더 어려워집니다(아마도 첫 번째 명령에 대한 맨페이지를 표시하고 최선의 결과를 바랍니다). 명령이 별칭이 아닌 쉘 함수라면 절망적입니다. 따라서 별칭의 압축을 풀고 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.

답변3

쉘이 별칭을 이런 방식으로 처리하는 경우:

$ 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공백을 찾는 것보다 병합하고 `및를 포함하는 별칭을 허용합니다 '.

답변4

이것은 나쁜 생각입니다. alias 명령을 찾을 수도 있고 찾지 못할 수도 있는 쉘 함수를 사용할 수 있습니다. 반대로, 나는 거의 항상 사물의 기본 이름을 재정의하지 않습니다. 특히 명령이 완전히 다른 것을 실행하도록 만들지 않는 경우가 많습니다. 밟을 갈퀴가 너무 많습니다. 이 경고를 염두에 두고 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
% 

이 코드를 다른 쉘로 포팅하는 것은 독자의 연습 문제로 남겨집니다. 또는 이 코드를 단순화하고 사용하지 마세요. 복잡해지면 큰 이점을 얻을 수 없습니다.

관련 정보