Bashrc'ta takma ad kullanırken olası çakışmalar nasıl test edilir?


12

Diğer ad komutlarını içeren bashrc güncelleştirmesi nedeniyle sistemde oluşan tüm komut çakışmalarını listelemenin basit bir yolu var mı?

Örneğin, birisi alias ls=/path/to/user-generated/executablebashrc'de yazar . Bunun gerçek bir komutu ( ls) maskelediğini nasıl öğrenir . Bir yol, bashrc kaynağından önce ve sonra tüm diğer adları çalıştırmak ve çıktıyı dağıtmak gibi görünüyor. Daha iyi yollar var mı?

Ubuntu 12.04 kullanıyorum.

bash - sürüm

GNU bash, sürüm 4.2.24 (1) -çalışma (i686-pc-linux-gnu)


Bir yan not olarak, bash'a özgü bir soru sorurken işletim sistemi sürümü yerine bash sürümünüzü sağlıyorsanız yanıt veren kişiler genellikle daha yararlıdır.
jordanm

@jordanm Güncellendi.
user13107

Yanıtlar:


8

Hangi komutların takma adlar tarafından maskelentiğini bulmak için aşağıdakine benzer bir şey yapın:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

açıklama

aliasyalnız tanımlanmış takma adları listeler ve adlarını sedçıkarır. While döngüsü type -tabunların her birinde çalışır ve awkhem diğer ad hem de dosya içeren satırları yazdırır.


15

typeBir komutun bash tarafından nasıl yorumlanacağını bulmak için kullanabilirsiniz .


Örneğin, burada type lsyazdırır ls is aliased to `ls --color=auto'.
l0b0

Aynı şey işe yarıyor which, ama şimdi kabuk yerleşimleri aynı ise (tip, hangi) artık yok.
Matematik

math: type whichsize söyler which is /usr/bin/which, bu yüzden bir yerleşik değildir. Bu nedenle, bir şeyin yerleşik olup olmadığını size söyleyemez (örneğin, which echokarşı type echo).
choroba

Sanırım kullandığınız kabuğa bağlı: type which which is a shell builtinBen zsh kullanıyorum.
matematik

@math: Orijinal soru / bash olarak etiketlendi.
choroba

7

İlk sorunuz olarak, çakışmaları listelemenin bir yolu yoktur, çünkü bash dahili olarak bir karma tablosu kullandığından, yalnızca son geçersiz kılmayı kaydeder.

Bir komutun takma ad olup olmadığını öğrenmek için alias ls, sizin durumunuzda kullanın , eğer size "bulunamadı" gibi bir şey söylerse o zaman bir takma ad değildir, aksi takdirde olur.

Diğer adı dikkate almadan orijinal işlevi başlatmak için, eğik çizgi önekini ekleyin, örn \ls. Gerçek karma l'leri başlatacak, diğer adı yok sayın.

DÜZENLE

Bir komutun takma ad olup olmadığını hızlı bir şekilde bilmek istiyorsanız set -x, şimdi hata ayıklama modunu şu şekilde etkinleştirebilirsiniz ls:

resim açıklamasını buraya girin

Gerçekleştirilen komutun hata ayıklama çıktısını göreceksiniz

Hata ayıklama modunu ayarlamak için set -


Teşekkürler. Ama rolü alamadım alias. Bir kullanıcı bir komutun (ör. ls) Olduğunu bilmiyorsa ne olur ? Koştuktan sonra bildiği tek şey alias ls, orijinal olarak eşlendiği şey değil, ne eşlendiğidir. Sanırım biri çatışma bulmak için \ ile ve olmadan tüm komutları çalıştırmak zorunda kalacak.
user13107

@ user13107 cevabı güncelledi
daisy

Teşekkürler. İzlemeyi nasıl ayarlayabilirim?
user13107

@ user13107 tekrar güncellendi ;-P
daisy

1
"Çatışmaları listelemenin bir yolu yok" - yeterince yaratıcı değilsiniz.
camh

6

compgenKullanarak tüm komutların ve diğer takma adların bir listesini almak için bash yerleşimini kullanabilirsiniz compgen -ac. Aynı zamanda diğer ad olan herhangi bir komut bu listede çoğaltılacaktır, bu nedenle basit naif çözüm çıktısında kopyaları aramaktır compgen -ac.

Bununla birlikte, yolda bir komut iki kez varsa, kopyalar da görünebilir. Örneğin, bir takma ad olmasa bile iki kez listeledim /bin/whichve /usr/bin/whichbu yüzden compgen -aclisteleyeceğim which.

Yani gerekli olan tüm kopyaları almak compgen -acve bunu bir takma ad listesiyle karşılaştırmaktır. Yalnızca takma ad olan kopyalar, komutları gizleyen takma adlardır. Bunu comm(1)komut ve bash işlemi ikamesi ile yapabiliriz.

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sort, sıralanan tüm diğer adların listesidir comm. compgen -ac | sort | uniq -dkomutlar ve takma adlar listesindeki tüm kopyaların listesidir. comm -12yalnızca her ikisi için ortak olan satırları çıkarır.


5

Kabuk etkileşimli bir kabuk çağırdığında tam olarak ne olduğunu görmek için kabuk hata ayıklama özelliğini kullanabilirsiniz. Aşağıda, bir giriş kabuğundan etkileşimli kabuk oluşturulduğunda atanan tüm diğer adlar gösterilmelidir:

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x -> hata ayıklamayı etkinleştir
  • -l -> giriş kabuğu
  • -i -> etkileşimli kabuk
  • -c -> komut

Kabuğun geri dönmesi için çıkış komutunun çalıştırılması gerekir. -iBash aksi bir komutu çalıştırmak için interaktif bir ortam kurmak olmaz çünkü bu durumda gereklidir.

İşte benim sistemimden bir örnek:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

Oluşan dosyayı belirlemek üzere takma ad atandığında en son hangi dosyanın kaynaklandığını görmek için grep'i genişletebilirsiniz:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

Bu yanlış pozitifler döndürebilir, ancak döndürülen verileri manuel olarak inceliyorsanız iyi olmalıdır. Yürütülen komutun önündeki '+' sembollerinin sayısı derinliği gösterir.

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

Bu örnek çıktısında, .bashrc lsöğesinin .foo diğer adları için bir diğer ad ayarladığını tve sonra da .bashrc öğesinin önceki diğer adını geçersiz kıldığını gösterir t.


Teşekkürler. Bu kesinlikle faydalıdır, ancak çatışmanın takma adları nasıl bulduğunu göremez.
user13107

@ user13107 Yararlı olması gereken bazı ayrıntıları ekledim. Takma adı yeni bir değere ayarlamak "çakışan" takma ad değildir. Bu normal belgelenmiş davranıştır, bu yüzden yuvarlak bir yol gereklidir.
jordanm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.