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