シェルが知っているすべてのコマンドをリストする


32

bash認識されているすべてのコマンドを一覧表示するシェル(たまたま)で何を入力できますか?

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

第二に、別の質問ですが、どうすればそれらをオーバーライドできますか?つまり、どのように私は自分の書くことができるviewだけで負荷に見える私のUbuntuシステム上の既存のものを置き換えるためにコマンドをvim


5
質問を組み合わせないでください。それぞれを個別の質問として投稿してください。
テルドン

unix.stackexchange.com/q/63073/135943のほぼ重複 (両方向にリンクしました。)
ワイルドカード

回答:


61

使用できます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.

4
には、厳密に言えばコマンドのcompgen -cようなもの{やそうwhileでないものが含まれることに注意してください。
ステファンシャゼル

13

シェルは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に準拠しません。


別のエッジケースは、現在のディレクトリ内の実行可能ファイルのリストに失敗する$PATHような、/bin:/usr/bin:(trailing :)のような値の場合です。
ステファンシャゼル

3

コマンドのリストは、2つのセットで構成されています。

  1. シェルに組み込まれたコマンド
  2. あなたのコマンド PATH

ビルトインを変更することはできませんが、のようなフルパス名を指定することにより、シェルがビルトインを使用しないようにすることができます/bin/echo

のコマンドについてはPATH、それ変更できます。 PATHコマンドを探すディレクトリをコロンで区切ったリストです。最初に一致したファイルが「勝ち」ます。

export PATH=~/bin:${PATH}

(この構文は、csh派生シェルでは機能しませんが、私が知っている他のすべてのシェルでは機能しません)。

その輸出PATHとの~/bin最初のエントリは、既存の残りの部分が続くとしてPATHエントリー。そのため、シェルはシステムが設定したdirectory calledbin in your home directory for a command *first* before checking the standardPATH をチェックします。代わりに以下を使用して、新しいディレクトリを最後にチェックするように簡単にできます。

export PATH=${PATH}:~/bin

PATH今後のログインのために永続化するには、.profileそれを他のシェルrcファイルに追加します。



1

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


エイリアスに関しては、システム上のどこからでも(たとえばシェルスクリプトから)コマンドが呼び出されたときに、コマンドを(「エイリアス解除」によって)オーバーライドおよびオーバーライド解除する簡単な方法ですか?
ミラー

1
どのシェルを使用していますか?bashのすべてのコマンドをリストするダブルタブを取得できません。
テルドン

Ubuntu 13.04でbashを使用しています。bashで使用可能なすべてのコマンドのリストを取得するために使用できるcompgenと呼ばれるコマンドもあります。
coffeMug

@terdon bash補完がインストールされていますか?
coffeMug

1
show-all-if-ambiguousをオフに設定
-coffeMug
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.