Giriş
Ubuntu, Debian ve türevlerinde birden fazla program aynı komutu sağladığında, varsayılan olarak hangisinin çalıştırılacağını belirlemek zor olabilir. Elle sembolik bağlantılar oluşturmak veya komut yollarını sabit kodlamak, bu seçimlerin sürdürülebilirliğini zorlaştırır ve sistem yönetimini karmaşık hale getirir.
update-alternatives komutu, bu seçimleri /etc/alternatives dizinindeki sembolik bağlantılar aracılığıyla yönetir. Bu araç sayesinde sistem yöneticileri, mevcut alternatifleri görüntüleyebilir, varsayılan seçimi değiştirebilir, yeni alternatifler ekleyebilir ve otomatik modu etkinleştirebilir. Bu makale, update-alternatives komutunun nasıl kullanılacağını adım adım açıklamaktadır.
Neden update-alternatives Kullanılmalı?
- Sürdürülebilirlik: Elle sembolik bağlantılar oluşturmak yerine, sistem alternatiflerini merkezi olarak yönetmeyi sağlar.
- Kolaylık: Komut satırından yapılan seçimler, sistem paket yöneticisiyle uyumlu çalışır ve paket yükseltmeleri sırasında seçimlerin korunmasını sağlar.
- Esneklik: Hem otomatik modda (en yüksek öncelikli alternatif seçilir) hem de manuel modda (sistem yöneticisinin seçimi korunur) çalışabilir.
update-alternatives Nasıl Çalışır?
update-alternatives, her biri bir komut adı ve bu komut için kayıtlı program yollarını içeren alternatif gruplarını yönetir. Örneğin, java grubu, sistemde yüklü olan Java çalıştırıcılarından hangisinin /usr/bin/java komutu aracılığıyla çalıştırılacağını belirler.
Sistemde /usr/bin/java komutunu çalıştırdığınızda aslında doğrudan Java ikili dosyasına bağlanmaz. Bunun yerine, sembolik bir zincir oluşturulur:
/usr/bin/java → /etc/alternatives/java → /usr/lib/jvm/java-21-openjdk-amd64/bin/java
Bu iki aşamalı yapı sayesinde, sistem alternatifleri kolayca değiştirilebilir. Alternatifler, /var/lib/dpkg/alternatives dizininde saklanır ve sistem paket yöneticisiyle entegre şekilde çalışır.
Otomatik ve Manuel Mod
Her alternatif grubu iki moddan birinde çalışabilir:
- Otomatik Mod: Sistem, kayıtlı alternatifler arasında en yüksek önceliğe sahip olanı otomatik olarak seçer. Bu mod, sistem paketleri tarafından genellikle tercih edilir.
- Manuel Mod: Sistem yöneticisinin yaptığı seçim korunur ve ancak açıkça değiştirildiğinde veya geçersiz hale geldiğinde güncellenir. Bu mod, özel gereksinimler için kullanışlıdır.
Temel Sözdizimi
update-alternatives komutunun genel sözdizimi aşağıdaki gibidir:
update-alternatives [SEÇENEKLER] KOMUT
Komutlar ve seçenekler aşağıdaki gibidir:
- Değişiklik gerektiren komutlar (örneğin, alternatif seçimi yapmak)
sudoyetkisi gerektirir. - Bilgi sorgulama komutları (örneğin, mevcut alternatifleri listelemek)
sudogerektirmez.
Alternatif Gruplarını Listeleme
Tüm Alternatif Gruplarını Görüntüleme
Sistemde kayıtlı tüm alternatif gruplarını listelemek için aşağıdaki komutu çalıştırın:
update-alternatives --get-selections
Bu komut, her grubun adını, modunu (otomatik/manuel) ve seçilen program yolunu görüntüler. Örnek çıktı:
awk auto /usr/bin/mawk
editor auto /bin/nano
pager auto /bin/more
vi auto /usr/bin/vim.basic
İkinci sütun, grubun otomatik mi yoksa manuel mi modda olduğunu gösterir. Üçüncü sütun ise seçilen programın yolunu içerir. Sistemde yüklü paketlere bağlı olarak çıktılar değişiklik gösterebilir.
Belirli Bir Gruba Ait Alternatifleri Listeleme
Örneğin, java grubuna ait kayıtlı alternatifleri görüntülemek için:
update-alternatives --list java
Bu komut, grubun kayıtlı alternatiflerini listeler. Örnek çıktı:
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-21-openjdk-amd64/bin/java
Eğer belirtilen grup mevcut değilse, komut no alternatives for NAME şeklinde bir hata mesajı verecektir.
Bir Alternatifin Ayrıntılarını Görüntüleme
Belirli bir alternatif grubunun tüm kayıtlı seçeneklerini ve hangisinin aktif olduğunu görüntülemek için:
update-alternatives --display java
Örnek çıktı:
java - auto mode
link best version is /usr/lib/jvm/java-21-openjdk-amd64/bin/java
link currently points to /usr/lib/jvm/java-21-openjdk-amd64/bin/java
link java is /usr/bin/java
slave java.1.gz is /usr/share/man/man1/java.1.gz
/usr/lib/jvm/java-17-openjdk-amd64/bin/java - priority 1711
slave java.1.gz: /usr/lib/jvm/java-17-openjdk-amd64/man/man1/java.1.gz
/usr/lib/jvm/java-21-openjdk-amd64/bin/java - priority 2111
slave java.1.gz: /usr/lib/jvm/java-21-openjdk-amd64/man/man1/java.1.gz
Çıktıda, her alternatifin önceliği listelenir. Otomatik modda, en yüksek önceliğe sahip alternatif seçilir. slave satırları, ilgili dosyaları (örneğin, Java için man sayfası) gösterir.
Alternatifler Arasında Geçiş Yapma
Etkileşimli Seçim
Kayıtlı alternatifler arasında etkileşimli olarak seçim yapmak için:
sudo update-alternatives --config java
Bu komut, mevcut alternatifleri listeler ve kullanıcıdan seçim yapmasını ister. Örnek çıktı:
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2111 auto mode
1 /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711 manual mode
2 /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2111 manual mode
Press to keep the current choice[*], or type selection number:
Seçim numarasını girip Enter tuşuna basarak alternatifinizi değiştirebilirsiniz. 0 girerek otomatik moda geri dönebilir veya Enter tuşuna basarak mevcut seçimi koruyabilirsiniz.
Not: Bir grubun manuel modda olduğu durumlarda, yeni bir paket kurulduğunda alternatifiniz otomatik olarak değişmez. Seçiminiz korunur.
Alternatif Seçimini Komutla Belirleme
Komut satırından alternatif seçimini değiştirmek için --set seçeneğini kullanabilirsiniz. Bu, betiklerde ve otomatik kurulumlarda oldukça kullanışlıdır. Öncelikle, --list komutunu kullanarak alternatiflerin tam yolunu bulun:
update-alternatives --list java
Ardından, aşağıdaki komutla alternatifinizi değiştirin:
sudo update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java
Bu komut, grubu manuel moda geçirir ve seçilen alternatifin geçerli olması gerekir. Alternatif grubu bağımsız olduğundan, java grubunu değiştirmek javac grubunu etkilemez. Bağlantılı dosyaları görüntülemek için --display komutunu kullanabilirsiniz.
Yeni Alternatif Kaydetme
Paket yöneticisi dışında kurulan programlar için alternatif kaydetmek mümkündür. Örneğin, /opt/acme-tool-1.0/bin/acme-tool ve /opt/acme-tool-2.0/bin/acme-tool yollarında iki farklı sürümünüz olduğunu varsayalım. Alternatifleri kaydetmeden önce dosyaların varlığını doğrulayın:
ls -l /opt/acme-tool-1.0/bin/acme-tool /opt/acme-tool-2.0/bin/acme-tool
Ardından, aşağıdaki komutlarla her iki sürümü de acme-tool grubuna kaydedin:
sudo update-alternatives --install /usr/local/bin/acme-tool acme-tool /opt/acme-tool-1.0/bin/acme-tool 100
sudo update-alternatives --install /usr/local/bin/acme-tool acme-tool /opt/acme-tool-2.0/bin/acme-tool 200
--install seçeneğinin argümanları şunlardır:
- LINK: Genel komut bağlantısının oluşturulacağı yol (örneğin,
/usr/local/bin/acme-tool). - NAME: Alternatif grubunun adı (örneğin,
acme-tool). - PATH: Gerçek ikili dosyanın yolu (örneğin,
/opt/acme-tool-1.0/bin/acme-tool). - PRIORITY: Öncelik değeri (daha yüksek olan otomatik modda seçilir).
Bu örnekte, otomatik modda daha yüksek önceliğe sahip olan 2.0 sürümü seçilecektir.
Uyarı:
/usr/bin/python3alternatifini değiştirmekten kaçının. Ubuntu ve Debian sistemlerinde Python, sistem araçları tarafından kullanılmaktadır. Bunun yerine, sürümlü komutları (python3.10gibi), sanal ortamları,pyenvveya/usr/local/binaltında özel komutlar kullanın.
Alternatif Kaldırma
Bir alternatifi kaldırmadan önce, grubun detaylarını görüntüleyerek doğru yolu doğrulayın:
update-alternatives --display acme-tool
Ardından, aşağıdaki komutla alternatifi kaldırın:
sudo update-alternatives --remove acme-tool /opt/acme-tool-1.0/bin/acme-tool
Bu komut, alternatifler veritabanından yolu kaldırır, ancak program dosyasını silmez. Aktif olan yolu kaldırırsanız, grup otomatik moda geçer ve kalan alternatifler arasından en iyisini seçer.
Otomatik Mode Dönüş
Manuel modda yaptığımız bir seçimi otomatik moda geri döndürmek için:
sudo update-alternatives --auto java
Bu komut, grubu otomatik moda geçirir ve en yüksek önceliğe sahip alternatifi seçer.
Editör Alternatifini Değiştirme
editor alternatifi, sistem genelinde /usr/bin/editor komutunu sağlar. Bu komutu kullanan programlar, seçilen alternatife uygun şekilde çalışır. Sistem editörünü değiştirmek için:
sudo update-alternatives --config editor
Listeden yüklü bir editörü seçin (örneğin, vim.basic). Uygulamaların kendi editör ayarları olabilir; örneğin, Git, GIT_EDITOR, core.editor, VISUAL ve EDITOR ortam değişkenlerini kontrol eder.
Hızlı Referans Tablosu
| Görev | Komut |
|---|---|
| Tüm alternatif gruplarını listele | update-alternatives --get-selections |
| Bir gruba ait yolları listele | update-alternatives --list NAME |
| Grubun detaylarını görüntüle | update-alternatives --display NAME |
| Etkileşimli seçim yap | sudo update-alternatives --config NAME |
| Alternatifi komutla seç | sudo update-alternatives --set NAME PATH |
| Otomatik moda dön | sudo update-alternatives --auto NAME |
| Yeni alternatif kaydet | sudo update-alternatives --install LINK NAME PATH PRIORITY |
| Alternatifi kaldır | sudo update-alternatives --remove NAME PATH |
Sorun Giderme
no alternatives for NAME
Belirtilen grup kayıtlı değildir. Mevcut grupları update-alternatives --get-selections komutuyla kontrol edin. Grubu kaydetmek için paket kurun veya --install seçeneğini kullanarak mevcut bir ikili dosyayı kaydedin.
alternative path ... does not exist
--install seçeneğine geçilen yol mevcut olmalıdır. Yolu ls -l PATH komutuyla kontrol edin, ardından yolu düzeltin veya programı kurun.
Düzenli bir dosya alternatifler bağlantısını engelliyor
--force seçeneğini hemen kullanmayın. dpkg -S /path/to/command komutuyla yolu hangi paketin sahiplendiğini kontrol edin ve yerel olarak kurulu dosyaları yedekleyin.
Sonuç
update-alternatives, sistem alternatiflerini yönetmek için güçlü ve esnek bir araçtır. Etkileşimli değişiklikler için --config, betiklerde kullanım için --set ve otomatik seçim için --auto seçeneklerini kullanın. Java gibi çoklu JDK'lar için pratik bir örnek için Java Sürümünü Kontrol Etme makalesine bakabilirsiniz.



