นามแฝง ZSH พร้อมพารามิเตอร์


94

ฉันกำลังพยายามสร้างนามแฝงที่มีพารามิเตอร์สำหรับคอมไพล์ง่ายๆของฉันเพิ่ม / คอมมิต / พุช

ฉันเคยเห็น Function สามารถใช้เป็นนามแฝงได้ฉันจึงลอง แต่ฉันไม่ได้ทำ ..

ก่อนที่ฉันจะมี:

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

แต่ฉันต้องการแก้ไขการกระทำของฉัน:

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

(ฉันรู้ว่ามันเป็นการฝึกคอมไพล์ที่แย่มาก)

คำตอบ:


113

คุณไม่สามารถสร้างนามแฝงที่มีอาร์กิวเมนต์ * ได้ต้องเป็นฟังก์ชัน []ฟังก์ชั่นของคุณอยู่ใกล้คุณเพียงแค่ต้องพูดข้อโต้แย้งบางอย่างแทนคำสั่งทั้งหมดและเพิ่มช่องว่างภายใน

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

*: หอยส่วนใหญ่ไม่อนุญาตให้มีการขัดแย้งในนามแฝงผมเชื่อว่า csh และอนุพันธ์ทำ แต่คุณไม่ควรจะใช้พวกเขาต่อไป


cshแต่มันไม่มีฟังก์ชันเลย (ฉันไม่รู้ว่าไม่มีฟังก์ชั่นเพราะนามแฝงสามารถรับพารามิเตอร์ได้หรือว่านามแฝงใช้พารามิเตอร์เพราะไม่มีฟังก์ชันหรืออะไร)
chepner

คุณจะเรียกมันว่า (จากเปลือก) gitall "my commit message"? หรือจะเรียกว่าgitall('my commit message')
archae0pteryx

ฟังก์ชั่น @ archae0pteryx จะเรียกว่าเหมือนคำสั่งอื่น ๆ gitall "my commit message"ดังนั้น
Kevin

ฉันขอแนะนำgetall() {โดยไม่ต้องนำหน้าfunction- แน่นอนว่ามันถูกกฎหมายไม่ว่าจะด้วยวิธีใดใน zsh แต่การเปลี่ยนแปลงเพียงอย่างเดียวจะทำให้สิ่งนี้เข้ากันได้กับเชลล์ที่เข้ากันได้กับ POSIX ทั้งหมด
Charles Duffy

9
BTW ถ้าคุณใช้git commit -m "${1:-update}"(การขยายพารามิเตอร์พร้อมค่าเริ่มต้นที่ให้มา) คุณจะไม่ต้องการifคำสั่งเลย
Charles Duffy

104

หากคุณจำเป็นต้องใช้นามแฝงกับพารามิเตอร์ด้วยเหตุผลบางประการคุณสามารถแฮ็กได้โดยการฝังฟังก์ชันในนามแฝงของคุณและดำเนินการทันที:

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

ฉันเห็นว่าวิธีนี้ใช้กันมากในนามแฝง. gitconfig


7
แฮ็คและยังสวยมาก
rococo

14
ทำไมต้องเป็นนามแฝงเลย? exampleเพียงแค่เรียกใช้ฟังก์ชัน
tripleee

1
นอกจากนี้คุณต้องมีอัฒภาคก่อนวงเล็บปีกกาปิด
tripleee

นี่เป็นสิ่งที่สวยงาม ด้วยสิ่งนี้ฉันจึงสามารถสร้างนามแฝงที่เพิ่มนามแฝงให้กับไฟล์ rc จากนั้นโหลดไฟล์ rc ใหม่อีกครั้ง ❤️นามแฝง addalias = 'f () {echo "alias" $ 1 >> ~ / .zshrc &&. ~ / .zshrc}; f '
MayTheSForceBeWithYou

5
ไม่จำเป็นต้องเพิ่มชื่อใด ๆ ในขอบเขตส่วนกลางเพียงแค่ใช้ฟังก์ชันที่ไม่ระบุชื่อ:alias example='(){ echo Your arg was $1. ;}'
maoizm

10

ฉันใช้ฟังก์ชันนี้ในไฟล์. 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
}

ที่นี่git push origin HEADมีหน้าที่ผลักดันสาขาปัจจุบันของคุณบนรีโมต

จากพรอมต์คำสั่งเรียกใช้คำสั่งนี้: gitall "commit message goes here"

หากเราเรียกใช้gitallโดยไม่มีข้อความคอมมิตข้อความการกระทำจะเป็นไปupdateตามที่ฟังก์ชันกล่าวไว้


4

"git add ."และคำสั่งอื่น ๆ ระหว่าง"เป็นเพียงสตริงสำหรับ bash ลบ"s

คุณอาจต้องการใช้[ -n "$1" ]แทนใน if body ของคุณ


0

ฉันลองใช้คำตอบที่ยอมรับแล้ว (ของเควิน) แต่ได้รับข้อผิดพลาดต่อไปนี้

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

ดังนั้นจึงเปลี่ยนไวยากรณ์เป็นสิ่งนี้ขึ้นอยู่กับปัญหาคอมไพล์และมันได้ผล

    function gitall {
    git add .
    if [ "$1" != "" ]
    then
        git commit -m "$1"
    else
        git commit -m update
    fi
    git push
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.