명령-v덮어쓴 후 잘못된 결과를 반환합니다.함수로

명령-v덮어쓴 후 잘못된 결과를 반환합니다.함수로

Git으로 초기화한 후 .bashrcPython 프로젝트를 생성하고 gitignore 및 readme를 생성하는 다음 함수를 갖게 됩니다.venvgit init python

__git_init_folder_for_python(){
local README='
### Description
Python3 Project

### Installation```
python3 -m venv ./
source bin/activate
pip3 install -r requirements.txt
```'

local GITIGNORE='
### For venv
__pycache__/
bin/
lib/
include/
pyenv.cfg
'
## $(command -v git) fails
$(which git) init \ 
  && python3 -m venv ./ \
  && . bin/activate \
  && pip3 freeze > requirements.txt 
  [[ ! -f "README.md" ]] && printf "%s\n" "$README" > README.md
  [[ ! -f ".gitignore" ]] && printf "%s\n" "$GITIGNORE" > .gitignore
}

__make_git_folder(){
  case "$1" in
    python )
      __git_init_folder_for_python
      ;;
    * )
      echo "not found"
  esac
}

git(){
  local ARG1="$1"
  local ARG2="$2"
  case "$ARG1" in
    'init' )
      if [[ "$ARG2" == "python" ]]; then
        __make_git_folder "$ARG2"
      else
        $(which -a git | head -1) "$ARG1" # $(command -v git) fails
      fi
      ;;
    *)
      $(which -a git | head -1) "$@" # $(command -v git) fails
  esac
}

gitbash 함수로 재정의했기 때문에 이런 일이 발생하는 이유를 알 것 같습니다 . 그래서:

$ command -v git
git

처럼:

$ type git | head -1
git is a function

그러나 which대신 사용 하면 git함수로 재정의한 후에도 올바른 경로를 반환합니다.

$ which git
/usr/local/bin/git

command -vgit 함수 앞에 경로를 명시적으로 선언하지 않고 올바른 경로를 반환하려면 어떻게 해야 합니까 ? 그러한 함수를 재정의하는 것은 나쁜 습관입니까? 그렇다면 올바른 접근 방식은 무엇입니까?

답변1

-v 명령을 사용하여 올바른 경로를 반환하는 방법

당신은 할 수 없습니다. 전체 경로를 원하면 를 사용하세요 which. 하지만 이 전체 경로는 필요하지 않을 것 같습니다. 그냥 전화해

command git ...

플래그 가 없습니다 -v. 이 플래그는 직관적인 동작이 없으며 command플래그 없이 수행되는 작업을 인쇄하지 않습니다.

그러나 which를 대신 사용하면 git을 함수로 재정의한 후에도 올바른 경로가 반환됩니다.

which외부 프로그램입니다. bash 기능에 대해서는 모릅니다. command내장되어 있습니다.

관련 정보