Bash

command -v <foo> 覆蓋 <foo> 作為函式後返回錯誤結果

  • November 1, 2020

在我用 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 &gt; requirements.txt 
 [[ ! -f "README.md" ]] && printf "%s\n" "$README" &gt; README.md
 [[ ! -f ".gitignore" ]] && printf "%s\n" "$GITIGNORE" &gt; .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是內置的。

引用自:https://unix.stackexchange.com/questions/617405