在我用 git 初始化之后,我有以下函数,.bashrc
它只是创建一个 python 项目并创建 gitignore 和 readme:venv
git 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
是一个内置的。