このウェブサイト「シェル関数は[エイリアスより]高速です。エイリアスは関数の後に検索されるため、解析が遅くなります。
これを考えると(正しいかどうか)、シェル関数はスタンドアロンシェルスクリプトとどのように比較されますか? 1つは他のものよりも特別な利点を持っていますか、それとも特定の種類の作業に適していますか?
答え1
エイリアスと関数の主な違いは、エイリアスはパラメータを使用しないが、関数はパラメータを使用することです。 、のようalias l='ls --color'
なものを書くと、エイリアス拡張をキャッチし、関数でできることとは異なる操作を実行できません。また、見ることができますl foo
ls --color foo
foo
エイリアスにパラメータを渡すには?。
エイリアスを探す今後関数:関数と呼ばれる別名の両方がある場合、foo
そのfoo
別名が呼び出されます。 (エイリアスがfoo
拡張された場合は一時的にブロックされるため、正常に動作することalias ls='ls --color'
ができます。また、実行していつでもエイリアスをバイパスできます。\foo
)しかし、測定可能なパフォーマンスの違いはないと予想されます。
関数とスタンドアロンスクリプトには、ほとんど同様の機能があります。私が考えることができるいくつかの違いは次のとおりです。
- 関数はシェル環境で実行され、スクリプトは別のプロセスで実行されます。したがって、関数は変化シェル環境:環境変数の定義、現在のディレクトリの変更などのスタンドアロンスクリプトはこれを実行できません。
- 関数は使用したいシェルの言語で書かなければなりません。スクリプトは任意の言語で書くことができます。
- 関数は定義時にロードされます。スクリプトが呼び出されるたびにロードされます。これにより、次のようないくつかの結果が発生します。
- スクリプトを変更すると、次回の呼び出し時に新しいバージョンが表示されます。関数定義を変更する場合は、定義を再ロードする必要があります。
- 負荷の高いシステムでは、機能が高速です。
- 使用しない機能が多いとメモリを占有します。 Kshとzshはbashではないようですが、自動ロード機能があります。
関数とスタンドアロンスクリプトの間には、組み込み関数をsource
使用して.
読み取るスクリプトフラグメントがあります。関数と同様に、シェル環境を変更でき、シェル言語で記述する必要があります。スクリプトと同様に、呼び出すたびにロードされ、非常に高速にロードされるわけではありません。
¹はい 、わかりました。 tcshでは動作しません。