Pertanyaan Bisakah saya mengirimkan argumen ke perintah alias?


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 dalam deklarasi perintah alias d lagi.

Apakah ada cara saya dapat memodifikasi deklarasi alias sehingga saya tidak perlu mengetik ulang deklarasi untuk mengubah jumlah baris. Seperti memasukkan melewati jumlah garis sebagai argumen saat mendeklarasikan alias untuk d? Atau apakah ada metode lain untuk menyelesaikan ini?


12
2018-05-21 09:29


asal


Dalam (t) csh, "\! *" Referensi argumen untuk alias (backslash hanya untuk menghindari tanda seru yang biasanya berarti "sejarah"), dan Anda bahkan dapat referensi argumen individu, meskipun saya tidak ingat caranya. Jadi mungkin "tail -n \! *" Atau sesuatu (saya tidak berpikir \! * Akan bekerja dengan tanda minus segera sebelum itu). Namun, tidak yakin apakah ini akan bekerja di (ba) sh. - barrycarter


Jawaban:


Alias ​​tidak mengambil argumen. Dengan alias suka alias foo='bar $1', yang $1 akan diperluas oleh shell ke argumen pertama shell (yang sepertinya tidak ada) ketika alias dijalankan.

Begitu: Gunakan fungsi, sebagai gantinya.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} menggunakan argumen pertama, dengan nilai default 5 jika tidak disediakan.

Maka Anda bisa melakukan:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Atau, jika Anda mengubah opsi yang Anda gunakan sedikit:

alias d="dmesg|grep -iw usb|tail -n 5"

Maka Anda bisa lulus tambahan -n pilihan:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Jika banyak -n opsi ditentukan untuk tail, hanya yang terakhir digunakan.


16
2018-05-21 09:34



Untuk penantang fungsional seperti saya :) mungkin ada gunanya untuk secara singkat menyatakan di mana harus meletakkan fungsi ... yaitu ~/.bashrc atau rc.local atau dimanapun? - WinEunuuchs2Unix
@ WinEunuuchs2Unix di mana pun alias itu akan diletakkan. - muru


Anda harus memiliki fungsi untuk ini seperti yang dijelaskan di BEGITU dan sini. Coba yang berikut ini:

foo() { /path/to/command "$@" ;}

dan panggil foo dengan:

foo arg1 arg2 arg3

2
2018-05-21 09:34





Bekerja di sekitar batasan alias dengan perintah grup dan di sini-string

Alias ​​tidak dapat mengambil argumen, tetapi kita dapat "mensimulasikan" itu. Ambil contoh contoh jawaban saya di pertanyaan ini.

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Poin-poin penting yang terjadi di sini:

  • kita gunakan read dibangun untuk membaca string menjadi variabel d. Karena kami ingin membaca string lengkap termasuk karakter kosong (baris baru, tab, spasi), kami gunakan IFS= dan menonaktifkan backslash escapes dengan -r.
  • <<< yang mana di sini-string operator memungkinkan kami untuk mengalihkan string apa pun yang kami berikan sebagai argumen mkcd alias; penggunaannya akan menjadi seperti mkcd "some directory"
  • beberapa perintah dalam alias digabungkan dan dieksekusi menggunakan shell saat ini { list; } struktur (yang dikenal sebagai group command dalam bash manual). Perhatikan bahwa ruang memimpin setelah { dan ; daftar individu dari perintah diperlukan.

Dalam contoh spesifik Anda yang dapat kami lakukan:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Kami juga dapat menggunakan perpecahan 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 menyediakan banyak argumen:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Tetapi apakah ini pendekatan yang baik?

Belum tentu. Masalah dengan pendekatan tersebut adalah bahwa hal itu 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 menghadapi argumen yang rumit, jadi pendekatan ini tidak cukup praktis. Fungsinya jauh lebih fleksibel. Dan kebutuhan untuk mengutip string args menjadi cepat menjadi menjengkelkan.

Terlepas dari keterbatasan, ini bekerja dengan string sederhana sebagai argumen di mana kita dapat membayar perpisahan kata, sehingga sebagian memungkinkan kita untuk memberikan argumen kepada alias.


2
2018-06-23 08:46