ฉันจะตั้งชื่อแทนเป็นเทอร์มินัลไลน์ได้อย่างไร?


9

ฉันต้องการตั้งค่านามแฝงgit-goเป็นเทอร์มินัลบรรทัดนี้ได้อย่างง่ายดาย:

git commit -m "init "; git push; git status

ดังนั้นเมื่อฉันป้อน git-go บรรทัดนี้ควรป้อน

ฉันจะทำสิ่งนั้นได้อย่างไร คำตอบที่ฉันเห็นครอบคลุมเฉพาะนามแฝงของคำสั่งที่ไม่มีพารามิเตอร์ แต่ฉันต้องการตั้งค่านามแฝงเป็นเทอร์มินัลบรรทัดโดยพลการ


คุณลองทำอะไร คำถามอื่นที่คุณอ่านมา askubuntu.com/q/17536/507051อธิบายได้ค่อนข้างดีคำถามของคุณคืออะไร
ของหวาน

ปัญหาของฉันใช้เครื่องหมายคำพูดคู่แทนคำเดียวสำหรับเครื่องหมายคำพูดภายนอก
Philip Rego

คุณสามารถใช้วิธีอื่นในการใช้เครื่องหมายคำพูดคู่ด้านนอกและเครื่องหมายคำพูดเดี่ยวด้านใน
Videonauth

คำตอบ:


13

คุณทำเช่นนี้ในลักษณะเดียวกับการตั้งชื่อแทนคุณ

alias git-go='git commit -m "init "; git push; git status'

สถานการณ์ที่มันยุ่งยากหากไม่ใช่นามแฝงที่รันคำสั่งและส่งอาร์กิวเมนต์ไปยังคำสั่งนั้นหรือแม้กระทั่งเมื่อนามแฝงรันคำสั่งหลายคำสั่งคั่นด้วย;แต่แทนที่จะเป็นเมื่อคุณต้องการให้นามแฝงยอมรับและใช้อาร์กิวเมนต์บรรทัดคำสั่งของตัวเอง .

ตัวอย่างเช่นสิ่งที่คุณเขียนหลังจากชื่อของนามแฝงว่าจะถูกวางลงบนปลายและทำให้ผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งที่สามคำสั่งหลังจากgit git status(จริงๆแล้วมันไม่ได้มากที่ข้อความต่อไปนี้จะถูกวางลงบนจุดสิ้นสุดเท่าที่มันเป็นข้อความที่เหลืออยู่คนเดียวและชื่อนามแฝงจะถูกแทนที่ด้วยคำนิยามของมัน)

ดังนั้นคุณสามารถเรียกใช้นามแฝงของคุณโดยไม่มีข้อโต้แย้งซึ่งใช้งานได้และคำสั่งสุดท้ายคือgit status:

git-go

git statusหรือคุณสามารถเรียกใช้มันมีข้อโต้แย้งที่คุณต้องการส่งผ่านไปยัง ตัวอย่างเช่นเมื่อคุณรันด้วยวิธีนี้คำสั่งสุดท้ายคือgit-status --show-stash:

git-go --show-stash

สิ่งที่คุณไม่สามารถทำได้กับนามแฝงใน Bash (และเชลล์สไตล์บอร์นอื่น ๆ ) คือการทำให้นามแฝงยอมรับอาร์กิวเมนต์บรรทัดคำสั่งและวางไว้ที่อื่นนอกเหนือจากจุดสิ้นสุด

ตัวอย่างเช่นสมมติว่าคุณต้องการgit-goยอมรับอาร์กิวเมนต์ที่ใช้สำหรับข้อความยืนยัน คุณจะไม่สามารถเขียนสิ่งนี้เป็นนามแฝงได้ วิธีแก้ปัญหาคือเขียนเป็นฟังก์ชันเชลล์แทน:

git-go() { git commit -m "$1"; git push; git status; }

ในความหมายของฟังก์ชั่นเปลือกที่พารามิเตอร์ตำแหน่ง$1, $2และอื่น ๆ เก็บค่าของอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งไปยังฟังก์ชั่นเปลือก นามแฝงไม่มีฟังก์ชันการทำงานที่สอดคล้องกับสิ่งนี้เนื่องจากการขยายนามแฝงเป็นรูปแบบของการประมวลผลแมโครที่เกิดขึ้นเร็วมากเมื่อเชลล์แยกวิเคราะห์คำสั่ง

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


1
ดียิ่งขึ้น: วางสคริปต์ที่มีชื่อgit-goไว้ใน PATH ของคุณและgit goจะใช้งานได้
D. Ben Knoble

10

คุณสามารถประกาศฟังก์ชั่นใน~/.bash_aliasesไฟล์ของคุณได้เช่น:

git-go(){
    git commit -m "init "
    git push
    git status
}

หรือคุณสามารถสร้างนามแฝงในไฟล์เดียวกันดังนี้:

alias git-go='git commit -m "init "; git push; git status'

อย่าลืมเปิดเทอร์มินัลหรือแหล่งไฟล์ ( . ~/.bash_aliases) หลังจากที่คุณเปลี่ยน


1
ข้อดีอย่างหนึ่งของการเขียนฟังก์ชั่นเชลล์แทนนามแฝงคือสิ่งหนึ่งที่ไม่จำเป็นต้องซ้อนคำพูด คำตอบนี้จึงกล่าวถึงปัญหาสำคัญที่ OP ได้เปิดใช้งานโดยตรงมากกว่าของฉัน
Eliah Kagan

@EliahKagan ทั้งคู่เป็นคนดีสำหรับคำถามนั้นถึงแม้ว่าคุณจะมีมากกว่านั้น ยินดีที่ได้พบคุณกลับมา
Videonauth

4

ในขณะที่คุณกำลังจัดการกับgitคำสั่งคุณอาจต้องการทราบไวยากรณ์สำหรับการเพิ่มนามแฝงโดยเฉพาะสำหรับgit:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

สิ่งนี้จะเพิ่มนามแฝงใหม่ให้กับgitการกำหนดค่าท้องถิ่นของคุณ(ที่~/.gitconfig) และอนุญาตให้คุณออก

git go

เมื่ออยู่ในgitพื้นที่เก็บข้อมูล เมื่อใดก็ตามที่คุณเรียกใช้git goเชลล์จะถูกเรียกใช้และคำสั่งgit commit -m "init"; git push; git statusจะถูกส่งไปยังเชลล์

ดูเอกสาร git สำหรับรายละเอียดเพิ่มเติม


3

มันเป็นปัญหาที่ยกมา ฉันได้ลองสิ่งนี้แล้ว:

alias="git commit -m "init "; git push; git status"

แต่ได้รับข้อผิดพลาดนี้:

bash: ; git push; git status: command not found

ฉันได้รับข้อผิดพลาดนั้นเนื่องจากฉันใช้เครื่องหมายคำพูดซ้อนกันไม่ถูกต้อง นี่คือไวยากรณ์ที่ถูกต้อง:

alias='git commit -m "init "; git push; git status'

หรือ:

alias="git commit -m 'init '; git push; git status"

หรือไม่มีเครื่องหมายคำพูดหากไม่มีช่องว่างในข้อความยืนยัน:

alias="git commit -m init; git push; git status"

ขอบคุณสำหรับการโพสต์คำตอบนี้ (เพราะคำตอบของฉันและ Videonauth ไม่ได้เน้นเรื่องการอ้างอิงมากนัก) เพราะเหตุใดคุณจึงต้องการให้เว้นวรรคต่อท้ายในข้อความยืนยันของคุณ
Eliah Kagan

ฉันเคยวางบรรทัดนี้ด้วยตนเองและฉันจะเพิ่มข้อความหลังช่องว่าง แต่นั่นก็ไม่สมเหตุสมผลเลย
Philip Rego

1
ในกรณีที่คุณไม่จำเป็นต้องพูดinit; ถือว่าเปลือก'init', "init"และinitเช่นเดียวกัน (ดังนั้นคุณอาจต้องการนำเวอร์ชันต้นฉบับกลับมาและแสดงเวอร์ชันใหม่เพื่อแสดงสถานการณ์ที่จำเป็นต้องมีเครื่องหมายคำพูดซ้อนกัน) สำหรับความสามารถในการเพิ่มข้อความที่เหลือคุณสามารถส่งข้อความนั้นเป็นบรรทัดคำสั่งได้ อาร์กิวเมนต์ถ้า (ตามที่แสดงใน Videonauth's และคำตอบของฉัน) คุณได้นิยามฟังก์ชันแทน alias ตัวอย่างเช่นคุณสามารถกำหนดgit-go() { git commit -m "init $1"; git push; git status; }(ซึ่งเป็นสิ่งที่ฉันมีในคำตอบของฉัน แต่"init $1"แทนที่จะเป็นเพียงแค่"$1")
Eliah Kagan

ขอบคุณนั่นคือสิ่งที่ฉันต้องการลองต่อไป
Philip Rego
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.