我该如何执行以下操作?
如果命令看起来像
git show .....
然后运行
git show ..... | bat -l rs
我的意思是,| bat -l rs
在运行之前添加到命令末尾。
答案1
#!/bin/bash
case "$1" in
show) git "$@" | bat -l rs ;;
*) git "$@" ;;
esac
然后将此脚本别名为git
.如果您想运行本机,git show
请使用\git
转义别名。
或者通过定义一个 shell 函数并使用command
,例如将其添加到 shell rc 文件(bash
-syntax):
git() {
case "$1" in
show) command git "$@" | bat -l rs ;;
*) command git "$@" ;;
esac
}
答案2
请注意,覆盖本机git
命令可能会对脚本等造成严重破坏;这与 git 别名隐藏现有命令的原因相同被默默地忽略。
但是,如果您将脚本定义为新的git 子命令通过命名它git-something
,它会自动被 git 拾取。因此,例如,git-myshow
在 的某处创建一个可执行文件PATH
,其内容为:
#!/bin/sh
git show "$@" | bat -l rs
会让你运行git myshow <any show arguments>
并将其安全地转换为git show <any show arguments> | bat -l rs
.子命令的名称将取决于脚本的名称(git-showit
==git showit
等),因此您可以选择任何您喜欢的名称,只要它与现有子命令不同即可。
答案3
Git 子命令的不同分页器
您可以将 Git 配置为使用不同的子命令使用不同的寻呼机。如果您特别想用于bat -l rs
但git show
不用于其他 Git 命令:
git config pager.show 'bat -l rs'
或者等效地,将以下内容放入您的~/.gitconfig
:
[pager]
show = bat -l rs
请注意,如果设置GIT_PAGER
环境变量,它将应用于所有 Git 子命令。
定义新的 Git 子命令
Git 本身有一个别名系统。您无法覆盖内置命令,但可以定义自己的命令。例如,将其放入您的~/.gitconfig
to make中,除了它通过 Bat 之外,git sb
它等效。git show
[alias]
sb = ! "f () { git show \"$@\" | bat -l rs; }; f"
请注意,git sb
即使git show
失败也会返回 0。为了避免这种情况,您需要依赖不同的 shell,例如 bash 或 zsh。
[alias]
sb = ! "zsh -c 'setopt pipe_fail; f () { git show \"$@\" | bat -l rs; }; f'"
在 shell 中解析命令
与Git的内置功能相比,这并不是特别方便,但还是可以做到的。定义一个名为 的函数git
,并使其解析其参数。这可以非常灵活,但第一步是解析 Git 命令行。很容易检查是否是第一个争论是show
,但更难检查第一个非选项论证是show
。这是一个执行此操作的函数,假设 的格式git --help
不会改变太多。
git () {
emulate -L zsh
setopt pipe_fail
local -A options_with_argument
options_with_argument=()
help="${$(command git --help)%%$'\n\n'*}"
while [[ $help =~ \\[(-[A-Za-z0-9]\ \<|--[-A-Za-z0-9]+=) ]]; do
local option=${${MATCH%%[= ]*}#'['}
options_with_argument[$option]=1
help=${help:$MEND}
done
local i=1
while [[ $@[$i] = -* ]]; do
if [[ -v options_with_argument[$@[$i]] ]]; then ((++i)); fi
((++i))
done
case $@[$i] in
show) command git "$@" | bat -r ls;;
*) command git "$@";;
esac
}
答案4
也许您可以创建一个 shell 函数来执行此操作:
git-show() {
git show $1 | bat -l rs
}
只需将其添加到您的 shell 配置中,然后运行git-show
(而不是git show
),您将获得所需的输出。