認識されたすべてのコマンドを一覧表示するシェルで何を入力できますか(たまたま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.
シェルは4種類のコマンドを認識しています。
~/.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//:/\/* }
コマンドのリストは、次の2つのセットで構成されています。
PATH
のコマンド組み込みを変更することはできませんが、/bin/echo
のような完全なパス名を指定することで、シェルが組み込みを使用しないようにすることができます。
PATH
のコマンドについては、canを変更します。 PATH
は、コマンドを検索するためのコロンで区切られたディレクトリのリストです。最初に一致したファイルが「wins」でした。
export PATH=~/bin:${PATH}
(この構文はcsh
派生シェルでは機能しませんが、私が知っている他のすべてのシェルでは機能しません)。
これにより、PATH
が最初のエントリとして~/bin
とともにエクスポートされ、残りの既存のPATH
エントリが続きます。したがって、シェルはシステムがセットアップしたdirectory called
binin your home directory for a command *first* before checking the standard
PATH`を確認します。代わりに、次のコマンドを使用して、新しいディレクトリを最後にチェックするようにすることができます。
export PATH=${PATH}:~/bin
今後のログインのためにPATH
を持続させるには、それを.profile
または他のシェルrcファイルに追加します。
タブキーを2回押してからyを押すと、現在のシェルで使用できるすべてのコマンドのリストが表示されます。 2番目の質問では、エイリアスを使用する必要があると思います: Shell alias 。