是否有内置方法为Bash中的任何给定子命令隐式指定前缀命令名?
例如git
有各种子命令,例如status
,branch
,log
,merge
,commit
等,所以我希望能做的就像是;
export BASH_???=git # assume there is a variable or something to change Bash’s built-in behavior temporarily
status # instead of `git status`
branch # instead of `git branch`
...
P.S。:我知道https://github.com/thoughtbot/gitsh,https://github.com/rtomayko/git-sh,https://github.com/caglar/gitsh和https://github.com/defunkt/repl;但是这些项目“包裹”了git
命令或任何命令而没有遵守用户的设置(例如PS1
或PROMPT_COMMAND
等)。
答案 0 :(得分:3)
我认为你能做到的最接近的事情就是使用command_not_found_handle(bash 4+)在你的git" sessions"中做这个间接。
这样大致(未经测试):
command_not_found_handle() {
if ! PAGER=cat git "$1" --help >/dev/null 2>&1; then
return $?
fi
git "$@"
}
答案 1 :(得分:1)
鉴于注释中讨论的命名空间问题,我会为选定的git子命令制作显式别名。为此,您可以使用这些bash函数
declare -a GITABBREVIATIONS=( status branch log merge commit )
function git_alias_init() {
for cmd in "${GITABBREVIATIONS[@]}"; do
alias "$cmd"='git '"$cmd"
done
}
function git_alias_end() {
for cmd in "${GITABBREVIATIONS[@]}"; do
unalias "$cmd"
done
}
您必须将其粘贴到.bashrc
(或source git-abbreviations.sh
来源)。然后你可以用
$ git_alias_init
并以
结束$ git_alias_end
答案 2 :(得分:0)
对于记录,这是一种替代方法,可以帮助任何可能对未来感兴趣的人。
这个想法是实现某种preexec
bash函数,它可以在你可以实现自己的命令之前运行,并接受/拒绝命令或更改等。