web-dev-qa-db-ja.com

エイリアスvs関数vsスクリプト

このサイト は、「シェル関数は[エイリアスよりも]高速です。エイリアスは関数の後に検索されるため、解決に時間がかかります。エイリアスは理解しやすいですが、ほとんどすべての目的でエイリアスよりもシェル関数が優先されます。 」

それが(真かどうかにかかわらず)与えられた場合、シェル関数はスタンドアロンシェルスクリプトとどのように比較されますか? 1つは他に比べて特定の利点がありますか、それとも特定のタイプのタスクにより適していますか?

37
Wolf

エイリアスと関数の主な違いは、エイリアスは引数を取らない¹が、関数は引数を取るということです。 alias l='ls --color'のようなものを書くと、l fools --color fooに展開されます。 fooをエイリアス展開に取得して、関数で実行できる方法とは異なる方法でそれを行うことはできません。 エイリアスにパラメータを渡す方法は? も参照してください。

エイリアスはbefore関数の前に検索されます。関数とfooというエイリアスの両方がある場合、fooはエイリアス。 (エイリアスfooが展開されている場合、一時的にブロックされるため、alias ls='ls --color'などが機能します。また、\fooを実行すると、いつでもエイリアスをバイパスできます。)ただし、測定可能なパフォーマンスの違いを期待することはできません。

関数とスタンドアロンスクリプトには、ほとんど同じような機能があります。ここに私が考えることができるいくつかの違いがあります:

  • 関数はシェル環境内で実行されます。スクリプトは別のプロセスで実行されます。したがって、関数はシェル環境を変更できます。環境変数を定義したり、現在のディレクトリを変更したりできます。スタンドアロンスクリプトではそれができません。
  • 関数は、それを使用するシェルの言語で記述する必要があります。スクリプトは任意の言語で記述できます。
  • 関数は定義時に読み込まれます。スクリプトは、呼び出されるたびにロードされます。これにはいくつかの影響があります:
    • スクリプトを変更すると、次にスクリプトを呼び出したときに新しいバージョンが取得されます。関数の定義を変更した場合は、定義を再ロードする必要があります。
    • 負荷の高いシステムでは関数が高速になります。
    • 使用できない機能がたくさんある場合、それらはメモリを消費します。 Kshとzshですが、bashではないと思いますが、関数のオートローディングの形式があります。

関数とスタンドアロンスクリプトの中間にあるのは、sourceまたは.ビルトインで読み取るスクリプトスニペットです。関数と同様に、シェルの環境を変更でき、シェルの言語で記述する必要があります。スクリプトと同様に、スクリプトは呼び出されるたびにロードされ、すぐにはロードされません。

¹ そうですね、これはtcshには当てはまりません。