Bash(Git) - 関数、エイリアス、SHスクリプトファイル

Bash(Git) - 関数、エイリアス、SHスクリプトファイル

私はエイリアスを使うのにとても慣れていました。特に、他のすべてのgitコマンドとコマンドの順序や相互依存関係などに非常に快適になりました。したがって、より複雑なスクリプトを実行するいくつかのエイリアスを作成しました。

alias stash='f() { .... }; f'

全体的に非常に簡単です。しかし、私は最も純粋な開発スタイルなので、「よく構成された」コードが好きです。フォームは時々機能と同じくらい重要です。したがって、単純な別名を使用してください。

alias gca='git commit --amend '

.bash_aliases問題なくファイルに直接リストできます。しかし、いくつかのマルチコマンドエイリアスでは、別々に分離したいと思います。

打者を打つhelpようです。

function name { COMMANDS ; } or name () { COMMANDS ; }

しかし、現在私が使用していると理解されている唯一の方法はfunctionエイリアス形式です。しかし、私がコメントしている投稿の色を考慮してgit diff --name-statusスクリプトをSHファイルに統合することができ、この例ではxargsを介してデータをSHファイルに渡します。

しかし、スクリプトを通して「関数」を生成して「エイリアス」としてリストするのではなく、shファイルに格納されている実際の関数としてリストすることは可能ですか?

想像力:

alias stash='f() { if [[ -z $1 ]]; then git stash list; else git stash $1; fi; }; f'

代わりstash.shに、ファイルには次のものが含まれます。

function stash
{
  if [[ -z $1 ]]; then
     stash list;
  else git stash $1;
  fi;
}

似たようなことは可能ですか?どちらの場合も、プロンプトに単に「stash」と入力しますが、まったく異なる方法で定義されますか?

答え1

ご使用の環境に必要な機能のリストを入手できます。

ファイルを作成し~/.bash_functionsてからインポートします~./bashrc。ソースと
同じ方法:./bash_aliases

if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi

次に、必要なだけ多くの(複雑な)関数を定義します。
関数のエイリアスを定義できます(順序を維持するために〜/ .bash_aliasesで)。ただし、ソース関数を直接呼び出すことができるので、実際には必要ありません。定義によると:

stash() {
    if [[ -z $1 ]]; then
        stash list;
    else
        git stash $1;
    fi;
}

または経由で単にstash呼び出すことができ、stash thisエイリアスは必要ありません。

答え2

関数定義をエイリアスに埋める理由は何か混乱しています。エイリアスstashは関数呼び出しを定義し、すぐにfそれを呼び出してエイリアスに渡された引数を受け取ります。日常的に使用する場合は、次の関数を定義するのと同じですstash

function stash {
  if (($# == 0)); then
     git stash list;
  else
     git stash "$@";
  fi;
}

エイリアスの内容と比較すると、次のようになります。

  • function stash { … }またはを使用してstash () { … }関数を定義できます。それらは同じです。すでに名前付きエイリアスを定義している場合は、関数を定義しようとすると拡張されるため、定義stashが必要に応じて機能しないということです。関数を定義するときは、関数名がすでにエイリアスとして定義されていないことを確認するか、構文を使用してくださいfunction
  • 私は(($#==0))最初のパラメータが空であるかどうかをテストするのではなく、関数にパラメータがあるかどうかをテストするためにこれを使用しています。意図はより明確です。 (これはnullパラメータを受け入れますが、ここでは意味がありません。)
  • 変数の拡張には常に二重引用符を使用してください。
  • gitを呼び出すときに"$@"代わりに使用します。関数のすべてのパラメータを渡します。"$1""$@"

エイリアス定義と同じ場所(たとえば、、.bashrcin、または.bash_aliases他のファイルなど)に関数定義を配置できます。.bashrc

. ~/lib/git-functions.bash

答え3

{   cat >myfunction.fn
    .  ./myfunction.fn
    fn  1 2 3 4 5
} <<""
    fn(){
        printf %s\\n "$@"
    }

1
2
3
4
5

シェル.コマンドは源泉現在のシェル実行環境の名前付きファイルです。そこに定義されているすべての関数、変数、エイリアス、または他の種類のシェルの状態は、発生時に持続しますreturn

あなたは一つ作ることができます自動ロードたとえば、スタブ関数を定義して関数定義の順序を指定します。

fn(){ . ./fn.file && fn "$@"; }

...ソースファイルには次のオーバーライドが含まれていますfn()

fn(){
   : a whole new fn
}
: any other init state commands you might like to run

関連情報