Dalam .profile
(bersumber dalam sh
mode emulasi dari saya .zshrc
), saya memiliki cuplikan berikut:
if [ -f /usr/bin/pacmatic ]; then
alias pacman=pacmatic
fi
# Colorized Pacman output
alias pacman="pacman --color auto"
Namun, alias kedua selalu menimpa yang pertama:
% type pacman
pacman is an alias for pacman --color auto
Bagaimana saya bisa membuatnya sehingga tugas alias kedua "mewarisi" tugas pertama, sehingga jika /usr/bin/pacmatic
ada, alias menjadi pacmatic --color auto
?
Saya tidak menolak untuk menggunakan fungsi alih-alih alias, tapi saya lebih suka jika logika tidak dilakukan setiap kali pacman
dipanggil (saya ingin pacmatic
diperiksa sekali, pada shell startup, tidak setiap kali pacman
dijalankan). Saya juga lebih suka sh
skrip -portable, tetapi jika ini tidak memungkinkan, Anda dapat menggunakan zsh
sintaks lengkap .
(Ya, aku menyadari bahwa ini bisa dengan mudah diselesaikan dengan menambahkan --color auto
ke pacmatic
alias. Tapi aku ingin melakukannya Way Kanan ™.)
Saya sudah mencoba Googling dan melihat-lihat halaman manual, tetapi tidak berhasil.
bash
), dan mereka dapat dengan mudah saling memanggil.Jawaban:
Shell
alias
berperilaku sangat mirip dengan#define
, yaitu mendefinisikan kembali alias shell akan menimpa yang sebelumnya.Saya tidak yakin apa yang akan menjadi Right Way TM , tetapi satu pendekatan akan menggunakan fungsi shell yang menerima parameter dan menggunakannya untuk membuat alias. Cuplikan kode Anda dapat ditulis ulang sebagai:
Selain itu, bahkan jika Anda menggunakan alias berbeda dan mencoba menggunakan satu untuk mendefinisikan yang lain, itu tidak akan berfungsi karena alias tidak diperluas dalam mode non-interaktif secara default. Anda harus mengaktifkannya dengan mengatur
expand_aliases
:Mengutip dari manual:
sumber
type pacman
kembalipacman is an alias for pacman --color auto
, baik dalamsh
mode emulasi dan dalamzsh
mode asli . Namun, sepertinya edit yang baru saja Anda buat adalah yang saya butuhkan.setopt aliases
.zsh
. Dan cangkang itu tampaknya bersifat interaktif.Substitusi alias hanya dilakukan ketika membaca baris dari sumber interaktif. Jadi alias kedua tidak terpengaruh oleh yang pertama, maka dari itu penggantian literal.
Mungkin sesuatu yang serupa:
Ini akan mengatur 'pacman' ke nilai yang tepat, variabel env PACMAN tidak diekspor, jadi itu akan hilang ketika skrip selesai, dan menggunakan "tanda kutip ganda" akan memastikan bahwa substitusi variabel terjadi pada deklarasi alias, tidak untuk setiap doa.
Saya menggunakan metode serupa:
Pada dasarnya, atur env var PACMAN, uji untuk jalur pacmatic, jika ditemukan, atur PACMAN, lalu tentukan alias.
Hmm, Anda bisa mengoptimalkan sedikit lagi ...
Taa Daa! Setel ke 'pacman' jika PACMAN tidak disetel atau null, jika tidak, setel ke nilai PACMAN, atur ke pacmatic oleh baris 'which'.
sumber
bash
tidak memperluas alias dalam mode non-interaktif, tetapi bagaimana itu sama dengan "sumber interaktif"?Di zsh, Anda dapat dengan mudah menambahkan alias dengan menggunakan
aliases
array asosiatif:Di shell lain, Anda perlu menggunakan output dari
alias
perintah untuk mencari tahu tentang alias yang ada.Sementara saya menawarkan ini sebagai kemungkinan, saya akan menggunakan variabel yang sudah disarankan oleh jawaban lain. Ini lebih jelas, dan Anda dapat membedakan nilai variabel jika Anda ingin mengonfigurasi beberapa hal secara berbeda berdasarkan yang mana dari salah satu
pacmatic
ataupacman
sedang digunakan.sumber
Versi singkat untuk alias ke-2 adalah:
sumber
Alias adalah untuk burung.
sumber