web-dev-qa-db-ja.com

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

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

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

第二に、別の質問ですが、どうすればそれらのどれを上書きできますか?つまり、独自のviewコマンドを記述して、Ubuntuシステムに存在するコマンドを置き換えるだけで、vimをロードしているように見えます。

41
themirror

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

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

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

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

_type some_name_を実行すると、名前が対応するコマンドのタイプを確認できます。

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

Bashでは、set組み込み関数は、関数とその定義、および変数をリストします。 bash、ksh、またはzshでは、_typeset -f_は関数とその定義をリストします。 bashでは、_compgen -c_を使用して、任意のタイプのすべてのコマンド名をリストできます。 _compgen -A alias_、_compgen -A builtin_ _compgen -A function_を使用して、特定のタイプのコマンドをリストできます。追加の文字列をcompgenに渡して、そのプレフィックスで始まるコマンドのみを一覧表示できます。

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

次のシェルにとらわれないスニペットは、使用可能なすべての外部プログラムをリストしています。

_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-command_が含まれていません。_compgen -c_にはwatは表示されませんが、watを実行できます。

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

¹ 例外:一部のビルトイン( 特殊ビルトイン と呼ばれます)は、関数でシャドウイングできません—ただし、bashとzshは、デフォルトモードではその時点でPOSIXに準拠していません。

bash を使用してこれを試してください:

printf '%s\n' ${PATH//:/\/* }
4
Gilles Quenot

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

  1. シェルに組み込まれているコマンド
  2. PATHのコマンド

組み込みを変更することはできませんが、/bin/echoのような完全なパス名を指定することで、シェルが組み込みを使用しないようにすることができます。

PATHのコマンドについては、canを変更します。 PATHは、コマンドを検索するためのコロンで区切られたディレクトリのリストです。最初に一致したファイルが「wins」でした。

export PATH=~/bin:${PATH}

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

これにより、PATHが最初のエントリとして~/binとともにエクスポートされ、残りの既存のPATHエントリが続きます。したがって、シェルはシステムがセットアップしたdirectory calledbinin your home directory for a command *first* before checking the standardPATH`を確認します。代わりに、次のコマンドを使用して、新しいディレクトリを最後にチェックするようにすることができます。

export PATH=${PATH}:~/bin

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

3
kurtm

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

1
coffeMug