Jalankan perintah yang dibayangi oleh alias

164

Katakanlah saya memiliki alias berikut dalam bash - alias ls='ls --color=auto'- dan saya ingin memanggil biasa lstanpa opsi. Apakah satu-satunya cara untuk melakukannya adalah ke unalias, melakukan perintah dan kemudian alias lagi? Atau ada beberapa trik atau solusi yang bagus?

Mirzhan Irkegulov
sumber
2
Hanya catatan tentang beberapa jawaban di bawah ini: "perintah" adalah cara HANYA aman untuk mencapai ini. Misalnya, "." atau "sumber" bawaan mungkin ditimpa oleh fungsi yang ditentukan skrip. "perintah." atau "sumber perintah" adalah satu-satunya cara untuk mengeksekusi sumber dengan aman tanpa fungsi yang ditentukan skrip dipanggil sebagai gantinya. Tidak ada alternatif lain, termasuk metode backslash "\.", Yang berfungsi, dan tentu saja tidak ada alternatif "/ bin / source" yang dapat Anda gunakan dengan menentukan path lengkap.
Dejay Clayton

Jawaban:

211

Anda juga dapat awalan garis miring untuk menonaktifkan alias: \ls

Sunting: Cara lain untuk melakukan hal yang sama meliputi:

Gunakan "perintah": command lssesuai Mikel .

Gunakan path lengkap: /bin/lssesuai uther .

Kutip perintah: "ls"atau 'ls'sesuai komentar Mikel.

Anda dapat menghapus alias sementara untuk sesi terminal dengan unalias command_name.

Tidak Sekarang
sumber
Ini adalah cara standar saya untuk melakukan ini.
ncmathsadist
sangat bagus, juga bekerja dengan baik dengan tcsh
Levon
10
Cara ini sangat bermanfaat. Hanya memintas alias, bukan fungsi, yang membuatnya berbeda dari commandatau builtin.
Mikel
1
Sepertinya l\smelakukan hal yang sama. Apakah perilaku ini bug atau fitur?
Niklas B.
4
Ini adalah "fitur". Hanya alias tanda kutip yang diperluas. Jadi Anda bisa memasukkannya ke dalam tanda kutip, atau menggunakan garis miring terbalik di mana pun Anda suka. Lihat referensi alias bash .
Mikel
79

Untuk itulah commandperintah itu.

Mencoba

command ls

Ini memberitahu shell untuk mem-bypass alias dan fungsi.

Cara ini didukung oleh bash , zsh , dan ash / dash.

Mikel
sumber
2
Jawaban terbaik, mengapa itu bukan yang paling terunggulkan? :) +1
0xC0000022L
11
Karena itu menambahkan 8 kali jumlah karakter sebagai metode backslash
JoelFan
1
@STATUS_ACCESS_DENIED Ini juga tidak berfungsi dengan tcsh (dan karena itu mungkin juga tidak dengan csh). Metode `\` tidak
Levon
3
Fitur backslash tidak aman. Meskipun ia memberikan perlindungan terhadap alias yang bernama sama, ia tidak memberikan perlindungan terhadap fungsi-fungsi yang bernama serupa.
Dejay Clayton
2
@ JoelFan Saya lebih suka memiliki beberapa karakter tambahan dan membuat skrip saya mudah diikuti dan bekerja untuk semua orang. Alih-alih slash samar yang tidak intuitif, mudah dilewatkan, tidak didokumentasikan dengan baik, dan tidak berfungsi untuk memintas fungsi.
Dennis
19

Alias ​​hanyalah jalan pintas yang ditentukan. Dalam contoh ini, alias yang didefinisikan adalah string ls, yang dijalankan ls --color=auto. Jika Anda tidak menginginkan perilaku itu, Anda bisa memanggil biner lsmenggunakan jalur absolut.

Jadi mengeksekusi hanya /bin/lsakan menghasilkan output tanpa warna karena itu bukan alias yang Anda tetapkan.

Anda juga dapat mengubah alias menjadi sesuatu yang berbeda, atau menambahkan alias baru yang dijalankan hanya lstanpa parameter warna.

George M
sumber
2
Anda harus tahu di mana perintah itu berada. Pada beberapa sistem, pembagian antara /bindan /usr/binarbitrer.
Keith Thompson
@KeithThompson Untuk itu, Anda bisa menggunakan whichuntuk beberapa perintah: which ls.
cst1992
@ cst1992: Jika Anda akan menggunakan which(atau type), ia melakukan pencarian via $PATH; Anda mungkin hanya menggunakan lsatau \lsdaripada menentukan path.
Keith Thompson
10

Cara lain, membangun berdasarkan jawaban @ uther, adalah dengan menggunakan $(which ...)atau `which ...`(menggunakan backticks ``) untuk secara otomatis menemukan jalur executable. Ini akan bekerja di bash:

$(which ls)

`which ls`

Tidak diragukan lagi, hanya awalan perintah dengan \jauh lebih pendek.

UPDATE : Menurut Cara menggunakan `yang` pada perintah alias? , ini sepertinya tidak bisa diandalkan sama sekali.

krlmlr
sumber
Untuk apa kurung itu? Saya kira Anda bermaksud `which ls`mengeksekusi biner secara langsung.
amyassin
2
@amyassin: Kedua sintaksinya sama. (BTW, bagaimana Anda mendapatkan backticks ke dalam pemformatan kode?)
krlmlr
Sebenarnya (which ls)itu tidak bekerja untuk saya (pada Ubuntu 12.04 LTS) Dan backticks itu sulit, saya hanya lolos dari mereka: \ `which ls \`. Butuh banyak pengeditan untuk sampai di sana :)
amyassin
1
@ user946850 "Untuk memasukkan karakter backtick literal dalam rentang kode, Anda dapat menggunakan beberapa backtick sebagai pembatas pembuka dan penutup". Sumber: Referensi Penurunan Harga .
Mikel
@amyassin: Apakah Anda menambahkan $?
krlmlr
2

Secara pribadi, saya hanya menghindari mendefinisikan alias dengan nama yang sama dengan perintah, jadi lsselalu aktifkan perintah yang sebenarnya. Saya memiliki alias atau fungsi untuk berbagai kombinasi pilihan seperti l, ll, dan lg. (Ini berarti saya butuhkan unalias lsdi .bashrcatau .cshrc.)

Saya menemukan bahwa asumsi OS tentang opsi mana yang saya lebih suka (mengesampingkan asumsi para perancang lsperintah itu sendiri) jarang cocok dengan selera pribadi saya. Kebetulan saya tidak menyukai tampilan ls --color=auto, dan keterbacaannya dapat sangat bervariasi antara hitam putih dan hitam putih.

YMMV, dan solusi lainnya tentu saja masih bagus untuk diketahui.

Keith Thompson
sumber
1

Mengetik perintah dalam huruf besar sepertinya berfungsi, seperti LS, meskipun saya tidak begitu yakin mengapa.

penilai
sumber
4
Di shell mana, sistem operasi apa, terminal mana, dll?
Mikel
@Mikel Ada paket "sl" yang menyediakan "sl" sebagai "ls". Tips yang diberikan bash di Ubuntu juga mengatakan bahwa "LS" disediakan oleh "sl".
Izkata
1
Ini adalah bash 4 (diinstal dengan Fink) di Mac OS X 10.7. Ini juga berfungsi untuk perintah lain yang saya alias rm dan grep.
penanggung jawab
3
Ini hanya lelucon :) dari halaman mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin
7
Saya pikir ini berfungsi untuk Mac OS X karena sistem file-nya tidak sensitif huruf secara default. Ini tidak akan bekerja pada unix lain.
Jander