Saya ingin tahu apakah saya bisa menyampaikan argumen dengan perintah alias.
sebagai contoh:
alias d="dmesg|grep -iw usb|tail -5"
Sekarang d
akan mencetak 5 baris terakhir. Jika saya ingin menggunakan d untuk mencetak jumlah baris yang berbeda, saya harus membuat perubahan pada perintah deklarasi alias d
lagi.
Apakah ada cara saya dapat memodifikasi deklarasi alias sehingga saya tidak perlu mengetik ulang deklarasi untuk mengubah jumlah baris. Suka menggabungkan melewati jumlah baris sebagai argumen sambil mendeklarasikan alias untuk d
? Atau adakah metode lain untuk menyelesaikan ini?
command-line
bash
alias
srk_cb
sumber
sumber
Jawaban:
Alias tidak mengambil argumen. Dengan alias seperti
alias foo='bar $1'
, maka$1
akan diperluas oleh shell ke argumen pertama shell (yang kemungkinan tidak ada) saat alias dijalankan.Jadi: Gunakan fungsi , sebagai gantinya.
num=${1:-5}
menggunakan argumen pertama, dengan nilai default 5 jika tidak disediakan.Maka Anda dapat melakukan:
Atau, jika Anda mengubah sedikit opsi yang Anda gunakan:
Kemudian Anda dapat melewati
-n
opsi tambahan :Jika beberapa
-n
opsi ditentukantail
, hanya yang terakhir yang digunakan.sumber
~/.bashrc
ataurc.local
atau di mana pun?Anda harus memiliki fungsi untuk ini seperti yang dijelaskan dalam SO dan di sini . Coba yang berikut ini:
dan panggil
foo
dengan:sumber
Mengatasi keterbatasan alias dengan perintah grup dan di sini-string
Alias tidak dapat mengambil argumen, tetapi kita dapat "mensimulasikan" itu. Ambil contoh jawaban saya untuk pertanyaan ini .
Poin-poin penting yang terjadi di sini:
read
bawaan untuk membaca string ke dalam variabeld
. Karena kami ingin membaca string lengkap termasuk karakter kosong (baris baru, tab, spasi), kami menggunakanIFS=
dan menonaktifkan backslash lolos dengan-r
.<<<
yang ada di sini-operator string memungkinkan kita untuk mengarahkan string apa pun yang kita berikan sebagai argumen kemkcd
alias; penggunaannya akan sepertimkcd "some directory"
{ list; }
struktur (yang dikenal sebagaigroup command
dalambash
manual). Perhatikan bahwa memimpin ruang setelah{
dan;
daftar perintah individu diperlukan.Dalam contoh spesifik Anda, kami dapat melakukan:
Kami juga dapat menggunakan pemisahan kata untuk menyimpan argumen yang dipisahkan oleh ruang:
Atau kita bisa menggunakan array untuk memberikan beberapa argumen:
Tetapi apakah ini pendekatan yang bagus?
Belum tentu. Masalah dengan pendekatan tersebut adalah sangat spesifik - argumen tidak dapat dikutip dengan mudah yang berarti kita hanya dapat memiliki argumen tanpa spasi.
Ini tentu saja bukan sesuatu yang akan digunakan secara luas, hanya karena di dunia nyata kita harus berurusan dengan argumen yang kompleks, jadi pendekatan ini tidak cukup praktis. Fungsinya jauh lebih fleksibel. Dan kebutuhan untuk mengutip string args menjadi cepat menjengkelkan.
Terlepas dari keterbatasannya, ini bekerja dengan string sederhana sebagai argumen di mana kita dapat memisahkan kata, sehingga sebagian memungkinkan kita untuk memberikan argumen kepada alias.
sumber