コマンド-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内蔵されています。

関連情報