bash認識されているすべてのコマンドを一覧表示するシェル(たまたま)で何を入力できますか?
また、これはシェルによって異なりますか?または、すべてのシェルに認識されるコマンドの「ディレクトリ」があるだけですか?
第二に、別の質問ですが、どうすればそれらをオーバーライドできますか?つまり、どのように私は自分の書くことができるviewだけで負荷に見える私のUbuntuシステム上の既存のものを置き換えるためにコマンドをvim。
bash認識されているすべてのコマンドを一覧表示するシェル(たまたま)で何を入力できますか?
また、これはシェルによって異なりますか?または、すべてのシェルに認識されるコマンドの「ディレクトリ」があるだけですか?
第二に、別の質問ですが、どうすればそれらをオーバーライドできますか?つまり、どのように私は自分の書くことができるviewだけで負荷に見える私のUbuntuシステム上の既存のものを置き換えるためにコマンドをvim。
回答:
使用できます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.
compgen -cようなもの{やそうwhileでないものが含まれることに注意してください。
シェルは4種類のコマンドを知っています。
~/.bashrcbashの場合)。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}(最後のものだけリスト外部コマンドという)。
次のシェルに依存しないスニペットには、使用可能なすべての外部プログラムがリストされています。
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に準拠しません。
$PATHような、/bin:/usr/bin:(trailing :)のような値の場合です。
コマンドのリストは、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ファイルに追加します。
Tabキーを2回押してからyを押すと、現在のシェルで使用可能なすべてのコマンドのリストが表示されます。2番目の質問では、alias:shell aliasを使用する必要があると思います。