Apakah mungkin untuk memeriksa di mana alias didefinisikan?

24

Alias, seperti lldidefinisikan dengan aliasperintah.

Saya dapat memeriksa perintah dengan hal-hal seperti type llyang dicetak

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

atau command -v llyang dicetak

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

atau alias llyang juga dicetak

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

tapi sepertinya saya tidak dapat menemukan di mana alias didefinisikan, yaitu file seperti .bashrc, atau mungkin secara manual di shell yang sedang berjalan. Pada titik ini saya tidak yakin apakah ini mungkin.

Haruskah saya cukup memeriksa semua file yang dimuat bashdan memeriksa semuanya?

polemon
sumber
Tanpa sadar saya katakan laribash -xl
Jeff Schaller

Jawaban:

21

Definisi manual akan sulit dikenali (log riwayat, mungkin) meskipun meminta shell untuk menunjukkan apa yang dilakukannya dan kemudian grepakan membantu menemukan yang ditetapkan dalam file rc:

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

Jika shell tidak secara tepat menangkap opsi yang diperlukan dengan salah satu doa di atas (yang secara interaktif menjalankan perintah nol), maka script:

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

Pilihan lain adalah menggunakan sesuatu seperti straceatau sysdiguntuk menemukan semua file yang disentuh shell, lalu buka grepsecara manual (berguna jika shell atau program tidak memiliki -xflag); file RC standar tidak cukup untuk pemeriksaan nama file manual jika sesuatu seperti oh-my-zsh atau konfigurasi khusus situs menarik kode dari siapa yang tahu di mana (atau mungkin juga ada variabel lingkungan, seperti yang ditunjukkan sorontar dalam jawaban mereka) .

thrig
sumber
Terima kasih! Walaupun outputnya agak sulit diurai, tapi saya menemukan file yang mendefinisikan alias yang saya cari. Ketika alias tidak ada di mana pun dalam daftar itu, apakah aman untuk mengasumsikan alias itu didefinisikan secara manual?
polemon
@polemon agak aman; itu bisa (atau telah) didefinisikan dalam file yang tidak dibaca karena siapa-tahu-apa-alasan-atau-telah dihapus (terutama jika ada semacam kerangka shell menambahkan kompleksitas bahwa pengguna tidak memahami).
cambuk
1
Untuk membuat titik di mana alias didefinisikan sedikit lebih mudah ditemukan, Anda dapat menggunakan PS4, yang ditambahkan ke setiap baris dalam sebuah jejak:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick
5

Di sinilah saya menemukan grep -rlsangat berguna:

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

akan memberi tahu Anda di file mana kata aliasitu digunakan.

Mungkin masuk ~/.bashrcdan pasti ~/.bash_aliaseskalau itu ada.


Namun tidak mungkin untuk benar-benar yakin bahwa itu mencakup semua opsi. File-file itu juga dapat memanggil atau memuat file lain. Variabel lingkungan seperti ENV atau $BASH_ENVmungkin mengarahkan bash untuk memuat beberapa file lainnya.

mencari variabel BASH_ENV di lingkungan, memperluas nilainya jika muncul di sana, dan menggunakan nilai yang diperluas sebagai nama file untuk dibaca dan dieksekusi.

Dan alias bahkan dapat didefinisikan dengan menetapkan variabel (penekanan milik saya):

BASH_ALIASES
Variabel array asosiatif yang anggotanya sesuai dengan daftar internal alias yang dikelola oleh alias builtin. Elemen yang ditambahkan ke array ini muncul di daftar alias

sorontar
sumber
grep -rl alias ~/.bash*mungkin salah mencocokkan file riwayat, tetapi +1 untuk menunjukkan array BASH_ALIASES!
Jeff Schaller
2

Saya tidak tahu cara untuk benar-benar daftar sumber alias Anda, tetapi karena sepertinya Anda menggunakan bash, saya pikir ini adalah file sumber yang mungkin:

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

Anda harus dapat memahami yang menemukan alias, mis grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
sumber
Atau file-file yang disertakan dari sana ...
Jeff Schaller
@ JeffSchaller - Benar, Anda akan membutuhkan sesuatu yang lebih kompleks untuk itu bash -x, seperti yang Anda sebutkan. Saya pikir di atas cukup mudah untuk dijalankan dengan cepat dan jika tidak menemukan alias Anda dapat membaca langkah-langkah eksekusi.
edaemon
1

Menggabungkan jawaban thrig ini dengan @ saran MarkPlotnick ini , Anda dapat menguji apakah BASH_ALIASES[ll]diatur untuk mempersempit bawah. The BASH_SOURCEarray dan LINENOvariabel sangat berguna di sini. Sayangnya, pemeriksaan apakah BASH_ALIASES[ll]disetel hanya akan berhasil setelah alias telah ditetapkan, dan sehingga baris tersebut bisa berada di file lain sama sekali.

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

Memberikan output seperti:

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

Anda bahkan dapat menghentikan shell menggunakan cek ini:

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

Saya sudah cukup sukses menggunakan which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Charles Clayton
sumber
1
whichdapat menangani alias di tcsh (dan mungkin csh sebelumnya) dan zsh di mana itu adalah builtin, dan di bash menggunakan profil default pada RedHat-family yang memiliki kludge untuk menjalankan program GNU (eksternal) tetapi memberi makan data alias shell, jika tidak tidak . Lebih penting itu hanya memberitahu apa alias diatur, bukan di mana itu diatur, yang merupakan Q di sini.
dave_thompson_085
-1

Periksa ~ /. Profil jika tidak ada di ~ / .bashrc

Michael Tatum
sumber
Atau file yang disertakan dari sana ...
Jeff Schaller
-1

Saya akhirnya menemukan lldefinisi alias untuk server web kami (CentOS) di dua skrip shell di /etc/profile.d/:

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

Aku menemukannya dengan pertama kali belajar dari komentar di atas di mana profil seluruh sistem adalah: /etc/profile. File itu menyatakan bahwa alias seluruh sistem didefinisikan /etc/bashrc, dan dalam file itu saya melihat bahwa itu loop melalui beberapa skrip shell /etc/profile.d/, dan jadi saya gunakan grepdalam direktori itu dan akhirnya menemukan definisi. Saya juga menemukan ada l.alias yang mencantumkan semua file dot:

Dari 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

(Ada alias yang setara di colorls.csh.)

Jordan Bradford
sumber
-1

Pertama gunakan perintah berikut

Daftar semua fungsi

functions 

Daftar semua alias

alias 

Jika Anda tidak menemukan alias atau fungsi, pertimbangkan metode pencarian yang lebih agresif

Versi bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Versi zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Penjelasan Singkat tentang Opsi

-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
jasonleonhard
sumber