15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
08.10.2024

Linux’ta `which` Komutu: Örneklerle Eksiksiz Teknik Kılavuz

Linux’taki `which` komutu, `PATH` ortam değişkeninde listelenen dizinleri tarayarak ve bulduğu ilk eşleşmeyi döndürerek bir çalıştırılabilir dosyanın mutlak yolunu bulur. Sistem yöneticileri, geliştiriciler ve DevOps mühendisleri tarafından ikili dosya konumlarını doğrulamak, yürütme ortamlarını denetlemek ve PATH ile ilgili çakışmaları hata ayıklamak için günlük olarak kullanılan POSIX’e yakın bir yardımcı programdır.

`which python3` komutunu çalıştırdığınızda, kabuk tüm dosya sistemini aramaz — yalnızca `$PATH` içinde depolanan, iki nokta üst üste ile ayrılmış dizin listesini soldan sağa doğru geçer ve ilk eşleşmede durur. Bu davranış hem en büyük gücü hem de anlaşılması gereken en önemli sınırlamasıdır.

Temel Sözdizimi

“`bash

which [options] command_name [command_name …]

“`

  • `[options]` — Çıktı davranışını değiştiren isteğe bağlı bayraklar (aşağıda ayrıntılı olarak ele alınmıştır).
  • `command_name` — Konumunu bulmak istediğiniz bir veya daha fazla çalıştırılabilir dosya adı.

`which` Dahili Olarak Nasıl Çalışır

`which` komutunu çağırdığınızda, `PATH` ortam değişkeninin mevcut değerini okur, `:` sınırlayıcılarına göre böler ve her dizini sırayla yineler. Her dizin için, komut adıyla eşleşen bir dosyanın var olup olmadığını ve çalıştırılabilir bitinin ayarlanıp ayarlanmadığını (`x` izni) kontrol eder. İlk eşleşme standart çıktıya yazdırılır.

Bu, `which` komutunun tamamen `$PATH` değişkeninin çalışma zamanı durumuna bağlı olduğu anlamına gelir. `PATH` değişkeniniz yanlış yapılandırılmışsa — örneğin, özel bir dizin `/usr/bin` yerine ondan sonra görünüyorsa — `which` bu yanlış yapılandırmayı tam olarak yansıtır; bu da onu hata ayıklama için neden bu kadar kullanışlı kıldığını açıklar.

Mevcut `PATH` değişkeninizi incelemek için:

“`bash

echo $PATH

Example output:

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

“`

Temel Kullanım Senaryoları ve Örnekler

Örnek 1: Tek Bir Çalıştırılabilir Dosyayı Bulma

En temel kullanım, bir ikili dosyanın nerede bulunduğunu bulmaktır:

“`bash

which python3

“`

“`

/usr/bin/python3

“`

Bu, `python3` yazdığınızda sistemin `/usr/bin/python3` dosyasını çalıştırdığını doğrular. Özel bir derleme yapıp `/opt/python3.12/bin/` dizinine yerleştirdiyseniz, ancak bu dizin `PATH` içinde değilse, `which` onu bulamaz.

Örnek 2: Tek Seferde Birden Fazla Komutu Sorgulama

Bir derleme ortamını denetlerken verimli olan tek bir çağrıda birden fazla komut adı geçirebilirsiniz:

“`bash

which python3 gcc git curl wget

“`

“`

/usr/bin/python3

/usr/bin/gcc

/usr/bin/git

/usr/bin/curl

/usr/bin/usr/bin/wget

“`

Bu, özellikle bir derleme başlamadan önce gerekli tüm araçların mevcut olduğunu doğrulamanız gereken CI/CD boru hattı doğrulama komut dosyalarında kullanışlıdır.

Örnek 3: `-a` ile Tüm Örnekleri Keşfetme

`-a` bayrağı, `which` komutuna ilk eşleşmeden sonra aramaya devam etmesini ve tüm `PATH` dizinlerinde bulunan her örneği raporlamasını söyler:

“`bash

which -a python3

“`

“`

/usr/bin/python3

/usr/local/bin/python3

“`

Bu, birden fazla Python sürümünün yüklü olduğu ortamlarda kritik öneme sahiptir — örneğin, `/usr/bin/python3` konumunda bir sistem Python’u ve `/usr/local/bin/python3` konumunda pyenv tarafından yönetilen bir sürüm. `PATH` içinde ilk görünen ikili dosya çalıştırılan dosyadır. Yanlış sürüm etkinse, bu çıktı çakışmanın tam olarak nereden kaynaklandığını gösterir.

Gerçek dünya uç durumu: Hem dağıtım paketi Node.js hem de nvm tarafından yönetilen Node.js çalıştıran sunucularda, `which -a node` sıklıkla iki veya üç çakışan yol ortaya çıkarır. Bunu çözmek için `PATH` girişlerini `.bashrc` veya `.zshrc` dosyasında yeniden sıralamak gerekir, yazılımı yeniden yüklemek değil.

Örnek 4: Takma Ad Çözümleme Davranışı

`which` komutunun takma adlarla davranışı, büyük ölçüde kabuğa ve sistemde yüklü olan `which` uygulamasına bağlıdır.

Birçok Linux dağıtımında, `which` bağımsız bir harici ikili dosyadır (kabuk yerleşiği değil), bu nedenle mevcut kabuğun takma ad tablosuna erişimi yoktur. Ancak `which` komutunun bir kabuk işlevi veya takma ad olarak uygulandığı sistemlerde (zsh yapılandırmalarında yaygın), takma adları çözümleyebilir:

“`bash

alias ls='ls –color=auto'

which ls

“`

İşlev tabanlı `which` kullanan bir zsh sisteminde:

“`

ls: aliased to ls –color=auto

“`

Harici ikili `which` kullanan bir bash sisteminde:

“`

/bin/ls

“`

Bu tutarsızlık, iyi bilinen bir karışıklık kaynağıdır ve deneyimli yöneticilerin komut dosyalarında `type` veya `command -v` kullanmayı tercih etmelerinin birincil nedenlerinden biridir (aşağıda ele alınmıştır).

Örnek 5: Koşullu Komut Dosyası Mantığında `which` Kullanımı

Kabuk komut dosyalarında yaygın bir kalıp, devam etmeden önce bir bağımlılığı kontrol etmek için `which` kullanmaktır:

“`bash

if ! which docker > /dev/null 2>&1; then

echo "Docker is not installed or not in PATH. Aborting."

exit 1

fi

“`

Ancak komut dosyaları için daha taşınabilir ve POSIX uyumlu yaklaşım `command -v` kullanmaktır:

“`bash

if ! command -v docker > /dev/null 2>&1; then

echo "Docker not found."

exit 1

fi

“`

Bu ayrım, birden fazla dağıtım veya kabukta çalışması amaçlanan komut dosyaları yazarken önem taşır.

`which` ile `type` ile `command -v`: Teknik Karşılaştırma

Bu üç araç, örtüşen ancak farklı ihtiyaçları karşılar. İş için yanlış olanı seçmek, özellikle kabuk komut dosyalarında ince hatalara yol açar.

Özellik`which``type``command -v`
Harici ikili dosyaları bulurEvetEvetEvet
Kabuk takma adlarını çözümlerUygulamaya bağlıEvet (her zaman)Evet (her zaman)
Kabuk işlevlerini çözümlerHayırEvetEvet
Kabuk yerleşiklerini tanımlarHayırEvetEvet
POSIX uyumluHayırEvetEvet
Komut dosyalarında güvenilir şekilde çalışırRiskliRiskli (bash yerleşiği)Önerilen
Çıktı biçimiYalnızca yolAçıklayıcı dizeYol veya tanım
Tüm PATH girişlerini arar (`-a` eşdeğeri)Evet (`-a` ile)Evet (`-a` ile)Hayır
Harici ikili dosya (yerleşik değil)EvetHayır (yerleşik)Hayır (yerleşik)

Pratik rehberlik:

  • Hızlı bir yol araması için terminalde etkileşimli olarak `which` kullanın.
  • Bir komutun aldığı her formu görmek istediğinizde (takma ad, işlev, yerleşik ve ikili) `type -a` kullanın.
  • POSIX taşınabilirliği için üretim kabuk komut dosyalarında `command -v` kullanın.

`type` Uygulamada

“`bash

type -a python3

“`

“`

python3 is /usr/bin/python3

python3 is /usr/local/bin/python3

“`

“`bash

type ls

“`

“`

ls is aliased to `ls –color=auto'

“`

`command -v` Uygulamada

“`bash

command -v git

“`

“`

/usr/bin/git

“`

“`bash

command -v ll

“`

“`

ll: aliased to ls -alF

“`

Pratik Hata Ayıklama Senaryoları

Yanlış Python Sürümünde Hata Ayıklama

Bir geliştirici, `python3 –version` komutunun `3.9.x` döndürdüğünü ancak özel bir derleme aracılığıyla `3.11` yüklediğini bildiriyor. Tanı sırası:

“`bash

which python3 # Shows the first match

which -a python3 # Shows all matches

echo $PATH # Reveals directory ordering

ls -la /usr/local/bin/python3 # Checks if the custom build is symlinked correctly

“`

Düzeltme neredeyse her zaman eksik bir sembolik bağlantı veya kabuğun başlatma dosyasındaki `PATH` sıralama sorunudur.

Kurulumdan Sonra Eksik Komutu Tanılama

`which curl` hiçbir çıktı döndürmüyorsa, ikili dosya ya yüklü değildir ya da `PATH` dışındaki bir dizine yüklenmiştir. Bu durumları birbirinden ayırt edin:

“`bash

which curl # No output = not in PATH

find /usr -name curl -type f 2>/dev/null # Search for the binary outside PATH

apt list –installed 2>/dev/null | grep curl # Check package manager

“`

Dağıtımdan Önce Araç Yollarını Doğrulama

Yeni bir VPS Hosting ortamı yapılandırırken, standart bir dağıtım öncesi kontrol listesi, uygulamanızın bağlı olduğu her kritik ikili dosyaya karşı `which -a` çalıştırmayı içermelidir. Bu, geliştirme, hazırlık ve üretim arasındaki ortam kaymasını çalışma zamanı hatalarına neden olmadan önce yakalar.

`which` Komutunun Bilinen Sınırlamaları

Bu sınırlamaları anlamak, karmaşık ortamlarda yanlış tanıyı önler:

  • Yalnızca `PATH` kapsamı: `which` komutu, `$PATH` üzerinden erişilemeyen herhangi bir çalıştırılabilir dosyayı göremez. `~/.local/bin` gibi kullanıcıya özel dizinlere yüklenen araçlar yalnızca bu dizin `PATH` içindeyse bulunabilir.
  • Kabuk yerleşiklerinden habersiz: `cd`, `echo`, `alias` ve `source` gibi komutlar kabuk yerleşikleridir. `which cd` hiçbir şey döndürmez veya nadiren kullanılan harici bir `cd` ikili dosyasının yolunu döndürür ve yanıltıcı bir sonuç verir.
  • Kabuğa özgü takma ad tabloları: Harici bir ikili dosya olarak `which`, çağıran kabuğun takma ad tablosunu okuyamaz. Bu, bash’te takma ad iç gözlemi için güvenilmez kılar.
  • Sembolik bağlantı şeffaflığı: `which` sembolik bağlantı yolunu raporlar, çözümlenen hedefi değil. `/usr/bin/python3` dosyası `/usr/bin/python3.11` dosyasına sembolik bağlantıysa, `which python3` komutu `/usr/bin/python3` gösterir. Tam zinciri çözümlemek için `readlink -f $(which python3)` kullanın.
  • `sudo` bağlamı: Bir komutu `sudo` ile çalıştırmak, kullanıcının `PATH` değişkeninden önemli ölçüde farklı olabilen root’un `PATH` değişkenini kullanır. Sıradan bir kullanıcı olarak `which node` komutu, `sudo which node` komutundan farklı bir yol döndürebilir.

Gelişmiş Kalıplar

Tam Sembolik Bağlantı Zincirini Çözümleme

“`bash

readlink -f $(which python3)

Output: /usr/bin/python3.11

“`

Yol ile Birlikte Çalıştırılabilir İzinleri Kontrol Etme

“`bash

ls -la $(which nginx)

Output: -rwxr-xr-x 1 root root 1234567 Jan 10 2024 /usr/sbin/nginx

“`

Toplu İnceleme için `xargs` ile Birleştirme

“`bash

echo "python3 gcc git" | xargs -n1 which

“`

Ortam Doğrulama Komut Dosyalarında Kullanım

Karmaşık bir uygulama yığını çalıştıran bir Dedicated Server üzerinde, bir başlangıç doğrulama komut dosyası şöyle görünebilir:

“`bash

#!/bin/bash

REQUIRED_BINS="nginx php-fpm mysql redis-cli composer"

MISSING=0

for bin in $REQUIRED_BINS; do

if ! command -v "$bin" > /dev/null 2>&1; then

echo "MISSING: $bin"

MISSING=$((MISSING + 1))

else

echo "OK: $bin -> $(which $bin)"

fi

done

[ "$MISSING" -gt 0 ] && exit 1

exit 0

“`

Kabuğa Özgü Davranış Notları

`which` komutunun davranışı tüm Linux ortamlarında aynı değildir:

  • Bash: `which` genellikle harici bir ikili dosyadır (`/usr/bin/which`). Dışa aktarılmadıkça bash takma adlarını veya işlevlerini görmez.
  • Zsh: Birçok zsh yapılandırması, takma adları ve işlevleri çözümleyen yerleşik bir kabuk işlevi olarak `which` içerir; bu da çıktısını daha zengin ancak bash’in davranışından farklı kılar.
  • Fish kabuğu: Fish, yerleşik olarak kendi `which` eşdeğerine sahiptir ve takma ad sistemi (`functions` olarak adlandırılır) farklı şekilde işlenir.
  • Alpine Linux / BusyBox ortamları: `which` yardımcı programı BusyBox tarafından sağlanır ve GNU `which` paketine kıyasla azaltılmış bir özellik setine sahip olabilir.

Bu değişkenlik, özellikle kapsayıcılı uygulamaları yönetirken veya temel kabuğun yerel geliştirme ortamınızdan farklı olabileceği VPS Control Panels yapılandırırken özellikle önemlidir.

Güvenlik Değerlendirmeleri

Güvenliğe duyarlı ortamlarda, `which` hafif bir denetim aracı olarak kullanılabilir:

  • `sudo`, `su` veya `passwd` gibi ayrıcalıklı ikili dosyaların beklenen sistem yollarına çözümlendiğini ve `PATH` içinde daha önce gelen kullanıcı tarafından yazılabilir dizinlere değil, doğru yerlere işaret ettiğini doğrulayın.
  • PATH ele geçirme girişimlerini tespit edin: `which ls` komutu `/bin/ls` yerine `/home/user/bin/ls` döndürüyorsa, kötü amaçlı bir ikili dosya enjekte edilmiş olabilir.

“`bash

Audit critical system binaries

for cmd in sudo su passwd ssh scp; do

echo "$cmd -> $(which $cmd)"

done

“`

Bu, SSL Certificates barındıracak veya ikili dosya bütünlüğünün tartışmasız olduğu hassas TLS sonlandırmasını işleyecek bir sunucuyu sertleştirirken standart bir adımdır.

Birden fazla kullanıcıya sahip Shared Web Hosting ortamlarını yönetirken, kullanıcı tarafından yazılabilir dizinlerin herhangi bir kullanıcının `PATH` değişkeninde sistem dizinlerinden önce görünmediğini doğrulamak önemli bir güvenlik kontrolüdür.

Karar Matrisi: Hangi Aracı Ne Zaman Kullanmalı

SenaryoÖnerilen Araç
Hızlı etkileşimli yol araması`which`
Komut dosyası: bir komutun var olup olmadığını kontrol etme`command -v`
Bir komutun takma ad mı yoksa işlev mi olduğunu belirleme`type`
PATH genelinde tüm örnekleri bulma`which -a` veya `type -a`
Sembolik bağlantıları son ikili dosyaya çözümleme`readlink -f $(which …)`
PATH ele geçirme denetimi`which` + manuel PATH incelemesi
Çapraz kabuk taşınabilir komut dosyaları`command -v`

Teknik Temel Çıkarımlar

  • `which` komutu, `$PATH` değişkenini soldan sağa arar ve ilk çalıştırılabilir eşleşmeyi döndürür — `PATH` girişlerinin sıralaması hangi ikili dosyanın çalıştırılacağını doğrudan belirler.
  • `-a` bayrağı, bir aracın birden fazla sürümü bir arada bulunduğunda önemlidir; kontrol etmeden yalnızca bir örneğin var olduğunu asla varsaymayın.
  • Üretim kabuk komut dosyalarında `which` kullanmayın — bash, dash ve zsh genelinde POSIX uyumluluğu ve tutarlı davranış için `command -v` kullanın.
  • `which` harici bir ikili dosya olarak çalıştığında mevcut kabuk oturumunda tanımlanan kabuk yerleşiklerini, işlevleri veya takma adları göremez.
  • Sembolik bağlantılar söz konusu olduğunda, çalıştırılan gerçek ikili dosyayı belirlemek için her zaman bir `which` sonucunu `readlink -f` ile takip edin.
  • Çok kullanıcılı veya kapsayıcılı ortamlarda, `PATH` kullanıcılar arasında ve `sudo` ile `sudo` olmayan bağlamlar arasında farklılık gösterir — her zaman doğru bağlamda doğrulayın.
  • `$PATH` değişkenine eklenen kullanıcı tarafından yazılabilir dizinler aracılığıyla PATH ele geçirme gerçek bir saldırı vektörüdür; `which` buna karşı hızlı bir ilk hat denetim aracıdır.

Sıkça Sorulan Sorular

`which` ile `whereis` arasındaki fark nedir?

`which` yalnızca çalıştırılabilir dosyalar için `$PATH` değişkenini arar. `whereis` ise ikili dosyayı, kılavuz sayfasını ve kaynak dosyalarını aynı anda bulmak için önceden tanımlanmış sistem dizinlerinin daha geniş bir kümesini arar. İkili dosyanın yanı sıra belgeleri veya kaynağı da bulmak istediğinizde `whereis` kullanın.

Neden `which cd` hiçbir şey döndürmüyor?

`cd` bir kabuk yerleşiğidir, harici bir çalıştırılabilir dosya değil. `which` yalnızca `$PATH` değişkenini çalıştırma iznine sahip dosyalar için taradığından, yerleşik komutları bulamaz. Bunun yerine `type cd` kullanın; bu komut `cd is a shell builtin` olarak doğru şekilde raporlayacaktır.

`which` bana yüklü bir programın hangi sürümünün olduğunu söyleyebilir mi?

Hayır. `which` yalnızca yolu döndürür. Sürümü almak için sonucu yönlendirin: `$(which python3) –version` veya basitçe `python3 –version`. `which` komutundan gelen yol, doğru ikili dosyayı sorguladığınızı doğrulamanıza yardımcı olur.

`which python3` neden `sudo` kullandığımda farklı bir sonuç döndürüyor?

`sudo` komutları, genellikle sıradan bir kullanıcının `PATH` değişkeninden daha kısıtlayıcı olan root’un `PATH` değişkeni dahil root’un ortamıyla çalıştırır. `~/.local/bin` gibi dizinler veya kullanıcının `.bashrc` değişkenine eklenen nvm/pyenv yolları, root’un `PATH` değişkeninde bulunmaz. Ayrıcalık yükseltilmiş yürütmede hata ayıklarken her zaman `sudo which python3` ile ayrı ayrı test edin.

`which` macOS’ta mevcut mu?

Evet, macOS BSD türevi kullanıcı alanının bir parçası olarak `which` içerir. Ancak macOS sürümü, eski sürümlerin tamamında `-a` bayrağını desteklemez. Homebrew yüklü modern macOS’ta, sistem sürümünün yanı sıra GNU `which` de yüklü olabilir. Hangi uygulamanın etkin olduğunu görmek için macOS’ta `type -a which` kullanın.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın