Apakah ada cara sederhana untuk mendaftar semua konflik perintah yang terjadi di sistem karena pembaruan bashrc yang melibatkan perintah alias?
Misalnya, seseorang menulis alias ls=/path/to/user-generated/executable
di bashrc. Bagaimana orang mengetahui bahwa ini menutupi perintah sebenarnya ( ls
). Salah satu cara tampaknya menjalankan semua alias sebelum dan sesudah sumber bashrc dan diff output. Apakah ada cara yang lebih baik?
Saya menjalankan Ubuntu 12.04.
bash --versi
GNU bash, versi 4.2.24 (1) -release (i686-pc-linux-gnu)
Jawaban:
Untuk mengetahui perintah apa yang ditutupi oleh alias, lakukan sesuatu seperti ini:
Penjelasan
alias
sendiri daftar alias yang telah ditentukan dansed
ekstrak namanya. Loop sementara berjalantype -ta
di masing-masing danawk
mencetak garis yang berisi alias dan file.sumber
Anda dapat menggunakan
type
untuk mencari tahu bagaimana suatu perintah akan ditafsirkan oleh bash.sumber
type ls
cetak dils is aliased to `ls --color=auto'
sini.which
, tapi saya tidak sekarang jika keduanya (tipe, yang) shell builtin sama.type which
memberitahu Andawhich is /usr/bin/which
, jadi itu bukan builtin. Oleh karena itu, tidak dapat memberi tahu Anda apakah sesuatu itu builtin atau tidak (misalnyawhich echo
versustype echo
).type which
which is a shell builtin
Saya menggunakan zsh.Sebagai pertanyaan pertama Anda, tidak ada cara untuk membuat daftar konflik, karena bash menggunakan tabel hash secara internal, itu hanya mencatat override terakhir.
Untuk mengetahui apakah suatu perintah adalah alias, gunakan
alias ls
dalam kasus Anda, jika itu memberi tahu Anda sesuatu seperti "tidak ditemukan" maka itu bukan alias, jika tidak demikian.Untuk menjalankan fungsi asli dengan mengabaikan alias, awali slash, mis.
\ls
Akan meluncurkan hass asli, abaikan alias.EDIT
Jika Anda ingin mengetahui dengan cepat jika suatu perintah adalah alias, Anda dapat mengaktifkan mode debugging dengan
set -x
, sekarang jika Anda menjalankanls
:Anda akan melihat output debug dari perintah yang sebenarnya dieksekusi
Untuk membatalkan mode debug, gunakan
set -
sumber
alias
bagian. Bagaimana jika pengguna tidak tahu bahwa ada perintah (misalnyals
)? Satu-satunya hal yang tampaknya dia ketahui setelah berlarialias ls
adalah apa yang dipetakan dan bukan apa yang awalnya dipetakan. Saya kira kita harus menjalankan semua perintah dengan dan tanpa \ untuk menemukan konflik.Anda dapat menggunakan bash builtin
compgen
untuk mendapatkan daftar semua perintah dan semua alias yang digunakancompgen -ac
. Perintah apa pun yang juga merupakan alias akan diduplikasi dalam daftar ini, sehingga solusi naif sederhana adalah mencari duplikat di outputcompgen -ac
.Namun, duplikat juga dapat muncul jika perintah ada di jalur dua kali. Misalnya, saya punya
/bin/which
dan/usr/bin/which
begitucompgen -ac
akan daftarwhich
dua kali meskipun tidak alias.Jadi yang diperlukan adalah mengambil semua duplikat
compgen -ac
dan membandingkannya dengan daftar alias. Hanya duplikat yang juga alias yang merupakan alias yang menyembunyikan perintah. Kita bisa melakukan ini dengancomm(1)
perintah dan dengan substitusi proses bash.compgen -a | sort
adalah daftar semua alias (diurutkan untukcomm
).compgen -ac | sort | uniq -d
adalah daftar semua duplikat dari daftar perintah dan alias.comm -12
hanya menghasilkan garis-garis yang umum untuk keduanya.sumber
Anda dapat menggunakan fitur debugging shell untuk melihat apa yang terjadi ketika bash memanggil shell interaktif. Yang berikut ini akan menunjukkan kepada Anda semua alias yang ditugaskan ketika shell interaktif dihasilkan dari shell login:
-x
-> aktifkan debugging-l
-> shell login-i
-> shell interaktif-c
-> perintahMenjalankan perintah keluar diperlukan agar shell kembali. The
-i
diperlukan dalam kasus ini karena bash tidak akan mendirikan sebuah lingkungan yang interaktif untuk menjalankan perintah sebaliknya.Ini adalah contoh dari sistem saya:
Untuk melihat file apa yang terakhir kali diambil ketika alias ditugaskan untuk menentukan file itu terjadi, Anda dapat memperluas grep:
Ini mungkin mengembalikan positif palsu, tetapi harus baik-baik saja jika Anda memeriksa secara manual data yang dikembalikan. Jumlah simbol '+' di depan perintah yang dieksekusi menunjukkan kedalaman.
Dalam output sampel ini, ini menunjukkan bahwa .bashrc menetapkan alias untuk
ls
, .foo aliast
, dan kemudian .bashrc menimpa alias sebelumnya darit
.sumber