常に 1 つのコマンドを別のコマンドにパイプします。

常に 1 つのコマンドを別のコマンドにパイプします。

次の方法は?

コマンドが次の場合

git show ..... 

その後実行

git show ..... | bat -l rs

私は、| bat -l rs実行する前にコマンドの最後に追加することを意味します。

答え1

#!/bin/bash

case "$1" in
   show) git "$@" | bat -l rs ;;
   *) git "$@" ;;
esac

次に、このスクリプトのエイリアスをgitgit show\git

または、シェル関数を定義し、を使用してcommandシェルrcファイルに追加します(bash-syntax)。

git() {
case "$1" in
   show) command git "$@" | bat -l rs ;;
   *) command git "$@" ;;
esac
}

答え2

基本コマンドをオーバーライドすると、スクリプトなどに大きなgitダメージを与える可能性があります。これは、gitエイリアスが既存のコマンドを隠すのと同じ理由です。静かに無視される

ただし、スクリプトを次のように定義すると、新しいgitサブコマンド名を指定すると、git-somethinggitは自動的に選択します。たとえば、次の内容を含む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を使用するように設定できます。他のサブコマンドは異なるポケットベルを使用します。。特別に別のGitコマンドを使用したいが、使用したくない場合bat -l rsgit show

git config pager.show 'bat -l rs'

または、等しく次のように入力します~/.gitconfig

[pager]
show = bat -l rs

環境変数を設定すると、GIT_PAGERすべてのGitサブコマンドに適用されます。

新しいGitサブコマンドの定義

Git自体には別名システムがあります。組み込みコマンドをオーバーライドすることはできませんが、直接定義することはできます。たとえば、これをmakeに入れると~/.gitconfigBatを通過することを除いて同じですgit sbgit show

[alias]
sb = ! "f () { git show \"$@\" | bat -l rs; }; f"

git sb失敗してもgit showゼロが返されることに注意してください。これを防ぐには、bashやzshなどの他のシェルを使用する必要があります。

[alias]
sb = ! "zsh -c 'setopt pipe_fail; f () { git show \"$@\" | bat -l rs; }; f'"

シェルからのコマンドの解析

これは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

おそらくこれを行うためにシェル関数を書くことができます。

git-show() {
     git show $1 | bat -l rs
}

これをシェル設定に追加して実行するとgit-show(代わりにgit show)目的の出力を取得できます。

関連情報