命令-v覆盖后返回错误结果作为函数

命令-v覆盖后返回错误结果作为函数

在我用 git 初始化之后,我有以下函数,.bashrc它只是创建一个 python 项目并创建 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
}

我想我知道为什么会发生,因为我已经覆盖git为 bash 函数。所以:

$ command -v git
git

作为:

$ type git | head -1
git is a function

但是,如果我which改为使用,即使在覆盖git为函数之后,它也会返回正确的路径。

$ which git
/usr/local/bin/git

如何command -v在 git 函数之前不显式声明路径的情况下返回正确的路径?覆盖这样的函数是一个不好的做法吗?如果是这样,正确的做法是什么?

答案1

如何使命令 -v 返回正确的路径

你不能。如果您想要完整路径,请使用which.但是,我认为您不需要这条完整路径。只需致电

command git ...

没有-v旗帜。该标志没有直观的行为,并且不会打印command没有该标志时会执行的操作。

但是,如果我使用 which 代替,即使在将 git 覆盖为函数之后,它也会返回正确的路径。

which是一个外部程序。它不知道 bash 函数。command是一个内置的。

相关内容