Bagaimana cara membuat alias yang benar-benar memperluas alias lain dengan nama yang sama di Bash?
Mengapa:
Saya dulu telah GREP_OPTIONS
menetapkan .bashrc
sesuatu seperti ini:
GREP_OPTIONS="-I --exclude=\*~"
Saya juga punya skrip (katakanlah, setup-java.sh
) yang akan saya panggil sebelum mengerjakan beberapa proyek Java. Itu akan berisi baris:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Jika saya juga menggunakan Sass, maka saya akan menelepon setup-sass.sh
yang berisi baris:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Tetapi GREP_OPTIONS
sudah usang dan tampaknya solusi standar adalah membuat alias atau beberapa skrip ...
Jawaban:
Bash menyimpan nilai alias dalam array yang disebut
BASH_ALIASES
:Dengan ekspansi parameter kita bisa mendapatkan alias set terakhir (jika ada) atau nilai default:
Sekarang lakukan saja
setup-java.sh
:... dan akhirnya
setup-sass.sh
:Jika tiga baris dipanggil, kita mendapatkan apa yang kita inginkan:
sumber
aliases
rantai jika Anda mengakhirinya dengan spasi.Anda dapat menulis seluruh skrip dengan cara itu, jika Anda cukup gila. Lagi pula, jika Anda ingin memperpanjang alias, maka pastikan alias yang Anda ingin perpanjang berakhir di spasi, dan tempel yang lain di.
sumber
exdir
? (Apakah itu hanya untuk penyelarasan karena alasan estetika?)fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"
. Melakukannya denganaliases
memungkinkan Anda untuk menggunakan ekspansi pola lebih langsung dan lebih aman. Anda memang membutuhkan konteks keduaeval
ketika dipanggil dari dalam suatu fungsi, tetapi itu pada dasarnya tidak aman selamapattern
danlist
namanya dikontrol oleh Anda. Mereka hanya dapat mematahkan dalam kebanyakan kasus bahkan ketika mereka tidak kecuali beberapa penyerang dengan sengaja mengakhiri Andacase
..bashrc
: sayaalias sudo='sudo '
, ini memungkinkan saya memanggil semua perintah alias saya setelah asudo
. Tanpa ruang itu tidak akan berhasilFungsi adalah opsi yang lebih baik daripada alias yang bisa diperpanjang di sini.
Dengan begitu, Anda memiliki dua opsi untuk menambahkan opsi ke lingkungan:
Ubah
grep_options
array; ini dengan benar mendukung opsi dengan spasi, karakter gumpal literal, dan kasing sudut lainnya:Gunakan
GREP_OPTIONS
variabel skalar tradisional , meskipun ada jebakannya (lihat BashFAQ # 50 untuk memahami beberapa di antaranya):Yang mengatakan, jika Anda ingin opsi Anda dicerminkan oleh
grep
instance yang dipanggil di luar shell, tidak ada alias atau fungsi yang akan dilakukan. Sebagai gantinya, Anda ingin skrip pembungkus ditempatkan lebih awal di PATH Anda daripadagrep
perintah yang sebenarnya . Misalnya:... dan di
~/bin/grep
:sumber