Bir takma adın nerede tanımlandığını kontrol etmek mümkün mü?


24

Komutla lltanımlandığı gibi bir diğer ad alias.

Komutu type llhangi baskılar ile kontrol edebilirim

ll is aliased to `ls -l --color=auto'

veya command -v llhangi yazdırır

alias ll='ls -l --color=auto'

veya alias llhangi da yazdırır

alias ll='ls -l --color=auto'

ancak takma adın tanımlandığı yeri bulamıyorum , yani .bashrcçalışan bir kabuğun içinde veya belki de elle bir dosya . Bu noktada bunun mümkün olup olmadığından emin değilim.

Sadece yüklenen tüm dosyaları bashgözden geçirmeli ve her birini kontrol etmeli miyim ?


Manşet Kapalı ben çalıştırmak derimbash -xl
Jeff Schaller

Yanıtlar:


21

Manüel tanımlamayı anlamak zor olabilir (tarihçenin günlükleri, belki de), ancak kabuktan ne yaptığını göstermesini isteyin ve sonra grepbir rc dosyasında ayarlanmış olanları bulmanıza yardımcı olmalıdır:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Kabuk, yukarıdaki çağrılardan biriyle (gerekli olarak etkileşimli olarak null komutunu çalıştıran) gerekli seçenekleri tam olarak yakalamıyorsa, o zaman script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Başka bir seçenek, bir şey gibi kullanmak straceveya kabuğun temas ettiği tüm dosyaları sysdigbulmak , sonra da el ile gitmek (kabuk veya programın bir bayrağı yoksa kullanışlı ) olacaktır; Standart RC dosyaları, manuel dosya adı kontrolü için, oh-my-zsh veya siteye özgü yapılandırmalar gibi bir şeyin kodu nereden çektiğini bilerek kodlamadan çekip almadıklarını kontrol etmek için yeterli değildir (ya da sorontar'ın cevabında işaret ettiği gibi, ortam değişkenleri olabilir) .grep-x


Teşekkürler! Çıktının ayrıştırılması biraz zor olsa da, aradığım diğer adı tanımlayan dosyayı buldum. Diğer ad bu listede hiçbir yerde bulunmadığında, diğer adın manuel olarak tanımlandığını varsaymak güvenli olur mu?
polemon,

@polemon biraz güvenli; kimin nedenini bildiği veya silindiği için okunamayan bir dosyada tanımlanmış olabilir (ya da silinmiş olabilir) (özellikle kullanıcının yapamadığı bir karmaşıklık ekleyen bir tür kabuk çerçeve varsa) anlama).
saat

1
Takma adı tanımlamanın biraz daha kolay olduğunu bulmak için, bir çizgideki her satıra hazır olan PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
PS4'ü kullanabilirsiniz

5

İşte grep -rlçok faydalı bulduğum yer :

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

kelimenin hangi dosyada aliaskullanıldığı size söyleyecektir .

Muhtemelen içinde ~/.bashrcve kesinlikle içinde ~/.bash_aliasesvarsa.


Bununla birlikte, tüm seçenekleri kapsadığından kesinlikle emin olmak imkansızdır. Bu dosyalar başka herhangi bir dosyayı arayabilir veya yükleyebilir. ENV gibi bir ortam değişkeni veya $BASH_ENVbash'i diğer bazı dosyaları yüklemek için yönlendirebilir.

ortamdaki BASH_ENV değişkenini arar, orada görünüyorsa değerini artırır ve genişletilmiş değeri okumak ve yürütmek için bir dosya adı olarak kullanır.

Ve diğer isimler bir değişken ayarlayarak bile tanımlanabilir (vurgu madeni):

BASH_ALIASES
Üyeleri, takma ad yerleşimi tarafından tutulan iç takma ad listesine karşılık gelen bir ilişkisel dizi değişkeni. Bu diziye eklenen öğeler diğer ad listesinde görünür.


grep -rl alias ~/.bash*yanlışlıkla geçmiş dosyalarla eşleşebilir, ancak BASH_ALIASES dizisini işaret etmek için +1!
Jeff Schaller

2

Takma adlarınızın kaynağını gerçekten listelemenin bir yolunu bilmiyorum, ancak bash kullanıyor gibi göründüğünüz için bunların kaynak dosyalarının olası olduğunu düşünüyorum:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Takma adı bulmak için bunları araştırabilmelisiniz, örneğin grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.


Ya dosyalar dahil orada ...
Jeff Schaller

@JeffSchaller - Doğru, bash -xbahsettiğiniz gibi , bunun için daha karmaşık bir şeye ihtiyacınız olacak. Yukarıdakilerin hızlıca çalıştırılabilecek kadar kolay olduğunu düşündüm ve takma adı bulamazsa uygulama adımlarını okuyabilirsiniz.
edaemon,

1

Birleştiren thrig cevabını ile MarkPlotnick önerisi @ , sen olmadığını test edebilirsiniz BASH_ALIASES[ll]daraltmak için ayarlanır. BASH_SOURCEDizi ve LINENOdeğişkenler burada özellikle yararlıdır. Ne yazık ki, BASH_ALIASES[ll]ayarlanmış olup olmadığının kontrolü ancak takma ad ayarlandıktan sonra başarılı olur ve bu nedenle bu ilk satır tamamen başka bir dosyada olabilir.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Gibi çıktı verilmesi:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Bu kontrolü kullanarak kabuğu sonlandırabilirsiniz:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'

0

Basitçe kullanarak başardım which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
whichtakma adları tcsh (ve belki daha önceki csh) ve zsh'nin yerleşik olduğu zsh ile ve bash olarak (harici) GNU programını çalıştırmak için bir kluju olan RedHat ailesinde varsayılan profili kullanarak ancak kabuk takma takma verilerini besler, . Daha da önemlisi, sadece takma adın neye ayarlandığı, nerede ayarlandığı değil, burada Q olduğu söylenir.
dave_thompson_085


-1

Sonunda llweb sunucumuzun (CentOS) takma ad tanımını iki kabuk komut dosyasında buldum /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Ben sistem çapında profil nerede yukarıdaki yorumlardan birinci öğrenme yoluyla buldum: /etc/profile. Bu dosya, sistem genelinde takma adların tanımlandığını /etc/bashrcbelirtir ve bu dosyada birkaç kabuk betiği içinden geçtiğini gördüm /etc/profile.d/ve bu grepdizinde kullandım ve sonunda tanımları buldum. Ayrıca l.tüm nokta dosyalarını listeleyen bir diğer ad olduğunu da keşfettim :

Kimden colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(İçinde eşdeğer diğer adlar var colorls.csh.)


-1

İlk önce aşağıdaki komutları kullanın

Tüm fonksiyonları listele

functions 

Tüm diğer adları listele

alias 

Takma adı veya işlevi bulamıyorsanız, daha agresif bir arama yöntemi düşünün

Bash sürümü

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh versiyonu

zsh -ixc : 2>&1 | grep thingToSearchHere

Seçeneklerin Kısa Açıklaması

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
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.