シェルが認識するすべてのコマンドを一覧表示する

シェルが認識するすべてのコマンドを一覧表示する

bash認識されるすべてのコマンドを一覧表示するには、シェル ( ) に何を入力すればよいでしょうか?

また、これはシェルによって異なりますか? それとも、すべてのシェルには認識するコマンドの「ディレクトリ」があるだけでしょうか?

次に、別の質問ですが、これらのいずれかをオーバーライドするにはどうすればよいでしょうか。言い換えると、viewUbuntu システムに存在する、単に をロードするだけのコマンドを置き換える独自のコマンドを作成するにはどうすればよいでしょうかvim

答え1

使用できますcompgen

compgen -c # will list all the commands you could run.

ご参考までに:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

答え2

シェルは 4 種類のコマンドを認識します。

  • エイリアス: これらは、いくつかのオプションを持つコマンドのニックネームです。これらは、シェルの初期化ファイル ( ~/.bashrcbash の場合) で定義されます。
  • 関数: 名前が付けられたシェル コードのスニペットです。エイリアスと同様に、シェルの初期化ファイルで定義されます。
  • 組み込みコマンド: シェルには、少数の組み込みコマンドが付属しています。組み込みコマンドのほとんどは、シェルの状態を操作します (cd現在のディレクトリの変更、setオプションと位置パラメータの変更、export環境の変更など)。ほとんどのシェルはほぼ同じ組み込みコマンドを提供していますが、各シェルには基本セットに対する拡張機能がいくつかあります。
  • 外部コマンド:シェルから独立しています。他のプログラムと同様に、シェルは外部プログラムをシェル内で検索して実行します。実行可能検索パス環境PATH変数には、プログラムを検索するディレクトリのコロンで区切られたリストが含まれています。

同じ名前で複数のタイプのコマンドがある場合は、上記の順序で最初に一致したものが実行されます¹。

を実行すると、名前がどのタイプのコマンドに対応しているかを確認できますtype some_name

引数なしで組み込み関数を実行すると、エイリアスを一覧表示できますalias。すべてのシェルで機能する関数または組み込み関数を一覧表示する方法はありません。組み込み関数の一覧は、シェルのドキュメントに記載されています。

bash では、set組み込み関数は関数とその定義、および変数を一覧表示します。bash、ksh、または zsh では、typeset -f関数とその定義を一覧表示します。bash では、 を使用してあらゆるタイプのすべてのコマンド名を一覧表示できますcompgen -c。 を使用してcompgen -A aliascompgen -A builtin compgen -A function特定のタイプのコマンドを一覧表示できます。 に追加の文字列を渡すと、compgenそのプレフィックスで始まるコマンドのみを一覧表示できます。

zsh では、、、を使用してecho ${(k)aliases}、特定のタイプの現在使用可能なコマンドを一覧表示できます(最後のコマンドは外部コマンドのみを一覧表示します)。echo ${(k)functions}echo ${(k)builtins}echo ${(k)commands}

次のシェルに依存しないスニペットは、利用可能なすべての外部プログラムを一覧表示します。

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Bash には、ハッシュされたコマンドというエッジケースがあります。

Bash リファレンスマニュアル言う:

$PATH内のディレクトリの完全検索は、コマンドがハッシュテーブルに見つからない場合にのみ実行されます。

試す:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

環境PATH変数には が含まれず~/dir-for-wat-commandcompgen -cは表示されませんwatが、 を実行することはできますwat

既存のコマンドをシャドウイングする場合は、エイリアスまたは関数を定義する

¹例外: いくつかの組み込み関数(特別な組み込み) は関数によってシャドウイングできません — ただし、bash と zsh は、デフォルト モードではその点に関して POSIX に準拠していません。

答え3

これを使って試してみてください:

(   # usage of a sub processus: the modificaion of PATH variable is local in ( )
    PATH+=:EOF # little hack to list last PATH dir
    printf '%s\n' ${PATH//:/\/* }
)

答え4

Tab キーを 2 回押して y キーを押すと、現在のシェルで使用可能なすべてのコマンドのリストが表示されます。2 番目の質問については、エイリアスを使用する必要があると思います。シェルエイリアス

関連情報