バッシュです。魚も同様に行動します。
$ which python
/usr/bin/python
$ alias py=python
$ type py
py is aliased to `python'
その後、実行は、以下に見られるものと同様の方法でtype -P py
期待どおりに何も印刷しません。/usr/bin/pyton
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/bin/ls
このオプションのマニュアル-P
は次のとおりです。
-P force a PATH search for each NAME, even if it is an alias,
builtin, or function, and returns the name of the disk file
that would be executed
/usr/bin
(ディレクトリpython
)がにあることを確認しましたPATH
。
ここで何が起こっているのでしょうか?
答え1
これ:
エイリアスでも、すべての名前に対して強制的にパス検索を実行します。
これは、bashがエイリアスを拡張してから拡張コマンドを検索するという意味ではありません。つまり、コマンドfoo
とエイリアスがある場合は、エイリアスがマスクされていても名前付きコマンドを探し続けます。したがって、bashは拡張されず、表示されません。foo
type -P foo
foo
py
type -P py
python
/usr/bin/python
答え2
py
何が起こっているのか、シェルは各ディレクトリに指定されたバイナリファイルを探していますが、PATH
何も見つかりません。
type -P
エイリアスや関数を解釈しません。タイプ'file'ではなく同じ名前を持つ他の使用可能なコマンドを無視し、指定された名前へのパスを取得します。
type -p
(andには追加の微妙さがありますtype -P
。ハッシュを考慮しているので、ハッシュがあればハッシュを見ずに表示しますPATH
。しかし、ここでは扱いません。)