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種類のコマンドを知っています。
~/.bashrc
bashの場合)。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 called
bin in your home directory for a command *first* before checking the standard
PATH をチェックします。代わりに以下を使用して、新しいディレクトリを最後にチェックするように簡単にできます。
export PATH=${PATH}:~/bin
PATH
今後のログインのために永続化するには、.profile
それを他のシェルrcファイルに追加します。
Tabキーを2回押してからyを押すと、現在のシェルで使用可能なすべてのコマンドのリストが表示されます。2番目の質問では、alias:shell aliasを使用する必要があると思います。