ฉันจะสร้างนามแฝงสำหรับคำสั่ง git [action] (ซึ่งมีช่องว่าง) ได้อย่างไร


29

นามแฝงของฉันส่วนใหญ่เป็นของแบบฟอร์มนี้: alias p='pwd'

ฉันต้องการนามแฝงgit commitเพื่อที่จะทำgit commit -v

แต่การพยายามสร้างนามแฝงที่มีช่องว่างทำให้เกิดข้อผิดพลาด:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

คำตอบ:


31

ไม่ใช่คำตอบที่ตรงกับคำถามของคุณ (เนื่องจากชื่อแทนสามารถเป็นหนึ่งคำได้) แต่คุณควรใช้git-configแทน:

git config --global alias.civ commit -v

สิ่งนี้จะสร้างนามแฝงคอมไพล์เพื่อให้git civทำงานgit commit -vได้ แต่น่าเสียดายที่ AFAIK มีวิธีที่จะลบล้างคำสั่งคอมไพล์ที่มีอยู่กับนามแฝงไม่มี อย่างไรก็ตามคุณสามารถเลือกชื่อนามแฝงที่เหมาะสมเพื่อใช้เป็นทางเลือกแทน


ดูบันทึกที่เพิ่มเพื่อตอบคำถามgit configไม่ได้git-config
Michael Durrant

เนื่องจากคำตอบของเธรดที่คุณเชื่อมโยงนั้นชัดเจนดังนั้นจึงเป็นไปได้ที่จะแทนที่gitคำสั่งที่มีอยู่ด้วยชื่อแทนด้วยเชลล์สคริปต์เพียงเล็กน้อย (ฉันไม่ได้โพสต์ความคิดเห็นนี้เป็นคำวิจารณ์ BTW คำตอบนั้นโพสต์เกือบหนึ่งปีหลังจากคุณ! ฉันเพิ่งโพสต์ด้วยความหวังว่าผู้คนอาจพบว่ามันมีประโยชน์)
sampablokuper

17

คุณกำลังพูดถึงคำสั่งที่มีช่องว่าง แต่ที่นี่คำสั่งคือgitและไม่มีที่ว่างในนั้น

ในการเรียกคำสั่งคอมไพล์คุณต้องเขียนมัน

git\ commit ...
'git commit' ...
"git commit" ...

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

csh, tcsh หรือ zsh จะช่วยให้คุณสามารถนามแฝงใด ๆ ข้างต้น แต่ไม่ทุบตีหรือ ksh (แม้ว่า pdksh จะช่วยให้คุณ แต่คุณจะไม่อนุญาตให้คุณใช้พวกเขา) ใน zsh:

alias "'git commit'=git commit -v"
'git commit' ...

จะทำให้git commandคำสั่ง (เมื่อเรียกว่าเป็น'git command'(ด้วยคำพูดเดียว) เท่านั้น) นามแฝงสำหรับgitคำสั่งที่มีcommitและ-vข้อโต้แย้ง ไม่ใช่สิ่งที่คุณกำลังมองหาฉันคาดเดา

เนื่องจากaliasสามารถใช้คำสั่ง alias ได้เพียงอย่างเดียวคุณสามารถนามแฝงได้ที่นี่คือgitคำสั่งและคุณต้องใช้นามแฝงกับสิ่งที่แทรก "-v" หลังจาก "commit" ในรายการอาร์กิวเมนต์ ดีที่สุดคือไปกับโซลูชันของ @ jw013 แต่ถ้าด้วยเหตุผลบางอย่างที่คุณทำไม่ได้หรือไม่แทนที่จะใช้นามแฝงคุณสามารถใช้ฟังก์ชันเพื่อทำงาน:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
โปรดทราบว่าการอนุญาตให้ใช้นามแฝงที่มีช่องว่างหรืออักขระพิเศษอื่น ๆ คือคุณสมบัติ csh ที่ไม่มีอยู่ในเชลล์สไตล์ Bourne (ซึ่ง zsh เลียนแบบในลักษณะที่แปลก) บอร์นสไตล์หอยขยายตัวนามแฝงปิดการใช้งานเมื่อคำแรกที่ยกมาในทางใดเห็นคำตอบของ Renan
Gilles 'หยุดชั่วร้าย'

ใช่. นั่นเป็นเหตุผลที่ฉันบอกว่ามันใช้งานได้เฉพาะใน csh, tcsh และ zsh ที่ไม่มีข้อผิดพลาดนั้น โปรดทราบว่าเชลล์เป้าหมายไม่รองรับนามแฝง นามแฝงถูกนำมาใช้โดย csh
Stéphane Chazelas

9

ใน Bash คุณไม่สามารถสร้างนามแฝงสำหรับคำสั่งที่มีช่องว่างใด ๆ ในนั้น
อย่างไรก็ตามฉันใช้ฟังก์ชั่นต่อไปนี้ใน. bashrc เป็นวิธีแก้ปัญหา

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

วิธีการทำงาน: คุณเริ่มต้นด้วยคำสั่งที่คุณต้องการโทร sudoในกรณีของฉันมันเป็น
จากนั้นคุณพูดถึงว่าจะใช้พารามิเตอร์ใด ในกรณีpacman -Syuนี้
หากทริกเกอร์คำสั่งใดที่ควรเรียกใช้งาน pacup.shในคำสั่งดังกล่าวข้างต้นมันเป็น
มิฉะนั้นคำสั่งอะไรที่จะถูกดำเนินการ, sudo $@. $@คือตามที่คุณจะเดาได้โดยรายการพารามิเตอร์ที่คำสั่งใช้

ดังนั้นการทำให้คำสั่งสำหรับกรณีเฉพาะของคุณมันจะเป็น:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

อย่างไรก็ตามโซลูชันนี้สำหรับกรณีทั่วไปมากขึ้นเมื่อคุณต้องการนามแฝงคำสั่งที่มีช่องว่างในพวกเขา
ในกรณีเฉพาะของคุณฉันขอแนะนำให้คุณใช้โซลูชันของ jw013 เพื่อใช้นามแฝงคำสั่ง git ของคุณโดยใช้git-config


คุณไม่หมายถึงif [[ $1 == 'commit' ]]...เหรอ การขยายตัวของ $ @ อาจมีข้อโต้แย้งมากขึ้นสำหรับความมุ่งมั่นที่คุณต้องการเก็บไว้
kojiro

ขวา! ไม่ดีของฉัน .. ฉันเพียงแค่เปลี่ยนคำสั่งที่ฉันใช้สำหรับระบบของฉัน
darnir

มันยอดเยี่ยมมาก - ขอบคุณ - สมบูรณ์แบบสำหรับสิ่งที่ฉันต้องการ
cgseller

4

จากหน้า man bash alias

คำแรกของแต่ละคำสั่งง่าย ๆ ถ้าไม่ได้อยู่ในเครื่องหมายคำพูดจะถูกตรวจสอบเพื่อดูว่ามันมีนามแฝงหรือไม่ ถ้าเป็นเช่นนั้นคำนั้นจะถูกแทนที่ด้วยข้อความของนามแฝง ชื่อนามแฝงและข้อความแทนที่อาจประกอบด้วยอินพุตเชลล์ที่ถูกต้องรวมถึงเชลล์เมตาอักขระโดยมีข้อยกเว้นว่าชื่อนามแฝงอาจไม่มี `= '

คำแรกของข้อความการแทนที่ถูกทดสอบสำหรับนามแฝง แต่คำที่เหมือนกันกับชื่อแทนที่กำลังขยายจะไม่ถูกขยายอีกเป็นครั้งที่สอง ซึ่งหมายความว่าอาจมีนามแฝงเป็น "ls -F" และ Bash ไม่พยายามขยายข้อความทดแทนซ้ำ

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

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

gitมันสามารถนำไปปรับใช้


ลิงค์ที่คุณให้นั้นแตกต่างจากเอกสารทุบตีที่ฉันมีและดูเหมือนจะขัดแย้งกับพฤติกรรมทุบตี มันบอกว่าข้างต้นนั้นอนุญาตให้เว้นวรรคตัวอย่างเช่นในชื่อนามแฝง ดูเหมือนว่าพฤติกรรม zsh กับฉันแม้ว่าหน้านั้นจะอธิบายอย่างชัดเจนว่าทุบตี
Stéphane Chazelas

2
@sch Bourne / POSIX shells บายพาสการขยาย alias หากคำใดคำหนึ่งถูกอ้างอิง ยกตัวอย่างเช่นทะลุนามแฝงสำหรับ\ls ls
Gilles 'หยุดความชั่วร้าย'

1
@Gilles เชลล์เป้าหมายไม่ได้ใช้นามแฝง POSIX กล่าวว่าคำที่ไม่ได้ยกมาจับคู่กับชื่อนามแฝงที่ถูกต้อง (เป็นเพียง ASCII alnum + [_!%,@]) จะถูกขยาย มันไม่ได้ห้ามส่วนขยายเช่นนามแฝงของ zsh ของ '\ ls' หรือนามแฝงของ ksh / dash / bash / zsh a-bมิฉะนั้นจะไม่มี POSIX เชลล์เดี่ยว ๆ มันเพิ่งบอกว่าสคริปต์แบบพกพา(ไม่ใช่เชลล์) ไม่ควรใช้นามแฝงใด ๆ
Stéphane Chazelas

2
@sch POSIX ช่วยให้การใช้งานที่จะใช้ตัวละครอื่น ๆ ในนามแฝงแต่อ้างเป็นส่วนหนึ่งของการขยายตัวนามแฝงคำยับยั้งใดหากคุณเขียน'git commit'ในตำแหน่งคำสั่งในเชลล์ POSIX มันจะต้องเรียกใช้ยูทิลิตี้ในตัวฟังก์ชั่นหรือคำสั่งภายนอก
Gilles 'หยุดชั่วร้าย'

0

แม้ว่าโซลูชันที่ถูกต้องคือใช้นามแฝงเช่น jw013 ที่แนะนำเพื่อสร้างนามแฝงที่มีช่องว่างคุณสามารถใช้นามแฝง NEST ได้

ตัวอย่างเช่นฉันมีนามแฝงที่จะลบสาขาทั้งในประเทศและจากระยะไกล แต่ฉันต้องการให้ผู้ใช้ระบุสาขาเสมอ:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

จากนี้เช่นนี้ควรจะทำงาน:

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

alias sudo='sudo '
alias shutdown="echo nope"

แต่ด้วยคำสั่งของคุณ:

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