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 .
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Poin-poin penting yang terjadi di sini:
- kami menggunakan
read
bawaan untuk membaca string ke dalam variabel d
. Karena kami ingin membaca string lengkap termasuk karakter kosong (baris baru, tab, spasi), kami menggunakan IFS=
dan menonaktifkan backslash lolos dengan -r
.
<<<
yang ada di sini-operator string memungkinkan kita untuk mengarahkan string apa pun yang kita berikan sebagai argumen ke mkcd
alias; penggunaannya akan sepertimkcd "some directory"
- banyak perintah dalam alias digabungkan dan dieksekusi dalam shell saat ini menggunakan
{ list; }
struktur (yang dikenal sebagai group command
dalam bash
manual). Perhatikan bahwa memimpin ruang setelah {
dan ;
daftar perintah individu diperlukan.
Dalam contoh spesifik Anda, kami dapat melakukan:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
Kami juga dapat menggunakan pemisahan kata untuk menyimpan argumen yang dipisahkan oleh ruang:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
Atau kita bisa menggunakan array untuk memberikan beberapa argumen:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
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.
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
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.