Alias ​​ZSH dengan parameter


94

Saya mencoba membuat alias dengan parameter untuk git add / commit / push saya yang sederhana.

Saya telah melihat Fungsi dapat digunakan sebagai alias jadi saya mencoba tetapi saya tidak membuatnya ..

sebelum saya memiliki:

alias gitall="git add . ; git commit -m 'update' ; git push"

Tetapi saya ingin dapat mengubah komit saya:

function gitall() {
    "git add ."
    if [$1 != ""]
        "git commit -m $1"
    else
        "git commit -m 'update'"
    fi
    "git push"
}

(saya tahu ini adalah praktik git yang buruk)

Jawaban:


113

Anda tidak dapat membuat alias dengan argumen *, itu harus berupa fungsi. Fungsi Anda sudah dekat, Anda hanya perlu mengutip argumen tertentu sebagai ganti seluruh perintah, dan menambahkan spasi di dalam [].

gitall() {
    git add .
    if [ "$1" != "" ] # or better, if [ -n "$1" ]
    then
        git commit -m "$1"
    else
        git commit -m update
    fi
    git push
}

*: Sebagian besar shell tidak mengizinkan argumen dalam alias, saya yakin csh dan turunannya mengizinkan, tetapi Anda tidak boleh menggunakannya .


cshtidak, tetapi tidak memiliki fungsi sama sekali. (Saya tidak tahu apakah tidak ada fungsi karena alias dapat mengambil parameter, atau jika alias mengambil parameter karena tidak ada fungsi, atau apa.)
— chepner

Jadi Anda akan menyebutnya (dari shell) seperti gitall "my commit message"? atau Anda akan menyebutnyagitall('my commit message')
— archae0pteryx

Fungsi @ archae0pteryx dipanggil persis seperti perintah lainnya, jadi gitall "my commit message".
— Kevin

Saya akan menyarankan getall() {tanpa sebelumnya function- tentu, itu legal di zsh, tetapi satu-satunya perubahan itu akan membuat ini kompatibel dengan semua shell yang sesuai dengan POSIX.
— Charles Duffy

9
BTW, jika Anda menggunakan git commit -m "${1:-update}"(perluasan parameter dengan default disediakan), maka Anda tidak memerlukan ifpernyataan itu sama sekali.
— Charles Duffy

104

Jika Anda benar-benar perlu menggunakan alias dengan parameter karena suatu alasan, Anda dapat meretasnya dengan menyematkan fungsi di alias Anda dan segera menjalankannya:

alias example='f() { echo Your arg was $1. };f'

Saya melihat pendekatan ini banyak digunakan dalam alias .gitconfig.


7
Sangat menarik namun sangat indah
— rococo

14
Mengapa membuat alias? Panggil saja fungsinya example.
— tripleee

1
Juga, terlambat, Anda membutuhkan titik koma sebelum kurung kurawal tutup.
— tripleee

Ini sangat indah. Dengan ini saya bisa membuat alias yang menambahkan alias ke file rc, lalu memuat ulang file rc tersebut. ❤️ alias addalias = 'f () {echo "alias" $ 1 >> ~ / .zshrc &&. ~ / .zshrc}; f '
— MayTheSForceBeWithYou

5
tidak perlu menambahkan nama apa pun ke dalam cakupan global, cukup gunakan fungsi anonim:alias example='(){ echo Your arg was $1. ;}'
— maoizm

10

Saya menggunakan fungsi ini di file .zshrc:

function gitall() {
    git add .
    if [ "$1" != "" ]
    then
        git commit -m "$1"
    else
        git commit -m update # default commit message is `update`
    fi # closing statement of if-else block
    git push origin HEAD
}

Di sini git push origin HEADbertanggung jawab untuk mendorong cabang Anda saat ini di jarak jauh.

Dari command prompt jalankan perintah ini: gitall "commit message goes here"

Jika kita hanya menjalankan gitalltanpa pesan komit maka pesan komit akan updateseperti fungsinya.


4

"git add ."dan perintah lain di antara "hanyalah string untuk bash, hapus "s.

Anda mungkin ingin menggunakannya [ -n "$1" ]sebagai gantinya di tubuh if Anda.


0

Saya mencoba jawaban yang diterima (Kevin) tetapi mendapatkan kesalahan berikut

defining function based on alias `gitall'
parse error near `()'

Karenanya mengubah sintaks ini, berdasarkan masalah git dan itu berhasil.

    function gitall {
    git add .
    if [ "$1" != "" ]
    then
        git commit -m "$1"
    else
        git commit -m update
    fi
    git push
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.