Bash
command -v <foo> 覆蓋 <foo> 作為函式後返回錯誤結果
在我用 git 初始化為之後,我有以下函式,
.bashrc
它只是創建一個 python 項目venv
並創建 gitignore 和自述文件: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 函式之前的路徑的情況下返回正確的路徑?覆蓋這樣的函式是一種不好的做法嗎?如果是這樣,正確的方法是什麼?
如何讓命令 -v 返回正確的路徑
你不能。如果您想要完整路徑,請使用
which
. 但是,我認為您不需要這條完整的路徑。打電話command git ...
沒有
-v
國旗。該標誌沒有直覺的行為,它不會列印command
沒有標誌會做什麼。但是,如果我改用 which,即使在將 git 作為函式覆蓋之後,它也會返回正確的路徑。
which
是一個外部程序。它不知道 bash 函式。command
是內置的。