ユーティリティ/ファイルが実行可能なバイナリかスクリプトなのか、単純なファイルなのか、シェル組み込みなどなのか、Zshはどのように区別しますか?
ベストアンサー1
コマンドの位置に単語が表示される場合、zsh はまずそれが単語であることを確認します。ニックネームまたは予約語。これは解析の一部として最初に発生します。 Zshはそれぞれの内部テーブルを持っているので、予約語とエイリアスを理解します。さらに、特定のサフィックスで終わる単語は、サフィックスがとして定義さ.ext
れているアクティブサフィックスエイリアスの形式である場合は、alias -s ext=…
一般エイリアスと同様に拡張されます。予約語はzshソースコードで変更されます(無効にできる場合を除く)。エイリアスは実行時に定義できます。
zshの準備ができたら注文の実行、コマンド位置にある単語の場合:
- 内部テーブルにその単語が表示される場合機能、関数として実行されます。関数は実行時に定義できます。
- それ以外の場合、その単語が内部テーブルに表示された場合組み込み機能。 zshのソースコードには初期組み込み関数セットがありますが、追加の組み込み関数は次のように定義できます。動的にロードされたモジュール。
- そうでない場合
auto_cd
オプション設定されている場合、単語はディレクトリへのパスであり、コマンドは引数を使用せず、zshはコマンドがその単語をcd
引数として使用するかのように動作します。 - それ以外の場合、zsh はその単語を外部コマンドの名前として扱います。それは次のことを行います
PATH
探すシステム機能と同様にexecvp
、ほとんどのシェルと同様に、zshはexecve
それを直接呼び出します。 - 外部コマンドの実行に失敗したが一致するファイルが存在する場合、zshはファイルの内容に応じて間接的にコマンドを実行しようとする可能性があります。
- ファイルがで始まると、
#!
zshはその行からインタプリタパスを読み込み、インタプリタ呼び出しを試みます。これはシェルボーン器具。最新のシステムでは、カーネルがこれを処理するため、zshの実装は一部の古代システムでのみ必要です。 - それ以外のファイルがテキストファイルのように見える場合、zshは
/bin/sh
それを呼び出します。この動作は、shebangメカニズムが存在する前と人々がシェルスクリプトをコマンド検索パスに入れてからsh
。
- ファイルがで始まると、
- これらのいずれもコマンドを実行できない場合、zshはその機能を実行します。
command_not_found_handler
、存在する場合。この関数は通常「foo」コマンドを見つけることはできませんが、sudo apt install somepackageを使用してインストールできます」などのメッセージを印刷するために使用されますが、他の方法でコマンドを実行しようとすることもできます。