web-dev-qa-db-ja.com

なぜ `which`は異なるバイナリを指すのですか?

システムにcurlの2つのバージョンがインストールされており、1つはhttp2をサポートしています。

whichを使用してバイナリを指すことができると思いましたが、期待どおりに動作しないようです。

$ curl --http2 -I https://something.example.com
curl: (1) Unsupported protocol
$ which curl
/usr/local/bin/curl
$ /usr/local/bin/curl --http2 -I https://something.example.com
HTTP/2 200  
server: nginx/1.10.0 (Ubuntu)  
date: Thu, 08 Jun 2017 20:55:09 GMT  
content-length: 928  
last-modified: Thu, 08 Jun 2017 19:43:10 GMT  
cache-control: public, max-age=31536000  
accept-ranges: bytes  

whichはローカルでビルドされたバイナリ/usr/local/bin/curlを指していますが、実際のコマンドはパッケージバイナリ/usr/bin/curlを実行しています

Curlのエイリアスがないので、誰かがなぜそうなのか説明してもらえますか?そして、curlへの実際のパスを見つけるためにどのコマンドを実行する必要がありますか、たまたま/usr/bin/curlです

2
Jeff Puckett

実行する場合:

echo $PATH

次のようなものが得られます。

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ご覧のとおり、/usr/local/binの優先度が高いため、bashはローカルにインストールされているバージョンのcurlを最初に検出し、検索を停止します。

この動作を変更するには、PATH環境変数を編集します(例:.profile):

PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/sbin:/usr/local/bin
1
Ravexina