始终将一个命令与另一个命令进行管道传输

始终将一个命令与另一个命令进行管道传输

我该如何执行以下操作?

如果命令看起来像

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 rsgit show不用于其他 Git 命令:

git config pager.show 'bat -l rs'

或者等效地,将以下内容放入您的~/.gitconfig

[pager]
show = bat -l rs

请注意,如果设置GIT_PAGER环境变量,它将应用于所有 Git 子命令。

定义新的 Git 子命令

Git 本身有一个别名系统。您无法覆盖内置命令,但可以定义自己的命令。例如,将其放入您的~/.gitconfigto 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),您将获得所需的输出。

相关内容