bash
認識されたすべてのコマンドを一覧表示するには、シェル()に何を入力する必要がありますか?
また、これはシェルによって異なりますか?それとも、すべてのシェルには認識可能なコマンドの「ディレクトリ」が1つしかありませんか?
第二に、それは別の質問ですが、どちらかをどのように無視できますか?つまり、view
ロードされたばかりのUbuntuシステムの既存のコマンドを置き換えるために、私のコマンドをどのように作成しますか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つのコマンドを知っています。
- エイリアス:特定のオプションを持つコマンドのエイリアスです。これはシェルの初期化ファイル(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
そのプレフィックスで始まるコマンドのみを一覧表示できます。
echo ${(k)aliases}
zsh では、 と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にはハッシュコマンドという極端なケースがあります。
バッシュリファレンスマニュアル説明する:
ハッシュテーブルでコマンドが見つからない場合にのみ、$ 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と互換性がありません。
答え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番目の質問にはエイリアスを使用する必要があると思います。シェルエイリアス。