เพิ่งชนเข้ากับสิ่งที่คล้ายกัน; หวังว่าจะเป็น oK เพื่อโพสต์บันทึกของฉัน สิ่งหนึ่งที่ทำให้ฉันสับสนเกี่ยวกับgit
นามแฝงที่มีข้อโต้แย้งอาจมาจากgit help config
(ฉันมีรุ่นคอมไพล์ 1.7.9.5):
หากส่วนขยาย alias ถูกเติมหน้าด้วยเครื่องหมายอัศเจรีย์จะถูกใช้เป็นคำสั่งเชลล์ ตัวอย่างเช่นการกำหนด "alias.new =! gitk --all --not ORIG_HEAD" การเรียกใช้ "git new" เทียบเท่ากับการรันคำสั่งเชลล์ "gitk --all --not ORIG_HEAD" โปรดทราบว่าคำสั่งเชลล์จะถูกดำเนินการจากไดเรกทอรีระดับบนสุดของที่เก็บซึ่งอาจไม่จำเป็นต้องเป็นไดเรกทอรีปัจจุบัน [ ... ]
วิธีที่ฉันเห็น - หากนามแฝง "จะได้รับการปฏิบัติในฐานะคำสั่งเชลล์" เมื่อนำหน้าด้วยเครื่องหมายอัศเจรีย์ - ทำไมฉันต้องใช้ฟังก์ชันหรือsh -c
ใช้อาร์กิวเมนต์ ทำไมไม่เพียงเขียนคำสั่งของฉันตามที่เป็นอยู่?
ฉันยังไม่รู้คำตอบ - แต่ฉันคิดว่าจริง ๆ แล้วมีความแตกต่างเล็กน้อยในผลลัพธ์ นี่คือการทดสอบเล็กน้อย - โยนสิ่งนี้ลงในของคุณ.git/config
หรือของคุณ~/.gitconfig
:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
นี่คือสิ่งที่ฉันเรียกใช้ชื่อแทนเหล่านี้:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... หรือ: เมื่อคุณใช้คำสั่ง "plain" หลังจาก!
"as-is" ในgit
นามแฝง - จากนั้นgit
จะผนวกรายการอาร์กิวเมนต์ให้กับคำสั่งนั้นโดยอัตโนมัติ! วิธีที่จะหลีกเลี่ยงมันเป็นจริงจะเรียกสคริปต์ของคุณเป็นทั้งฟังก์ชั่น - sh -c
หรือเป็นอาร์กิวเมนต์
สิ่งที่น่าสนใจอีกอย่างที่นี่ (สำหรับฉัน) คือในเชลล์สคริปต์โดยทั่วไปแล้วหนึ่งตัวคาดว่าตัวแปรอัตโนมัติ$0
จะเป็นชื่อไฟล์ของสคริปต์ แต่สำหรับgit
ฟังก์ชั่นนามแฝง$0
อาร์กิวเมนต์คือโดยทั่วไปแล้วเนื้อหาของสตริงทั้งหมดระบุคำสั่งนั้น (ตามที่ป้อนในไฟล์ปรับแต่ง)
ด้วยเหตุนี้ฉันเดาว่าหากคุณเกิดข้อผิดพลาดในกรณีด้านล่างนั่นจะเป็นการหลีกเลี่ยงคำพูดคู่นอก:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - จากนั้นgit
จะล้มเหลวด้วย (สำหรับฉันอย่างน้อย) ข้อความที่ค่อนข้างคลุมเครือ:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
ฉันคิดว่าเนื่องจากgit
"เห็น" สตริงทั้งหมดเป็นอาร์กิวเมนต์เดียวเท่านั้น!
- มันพยายามเรียกใช้เป็นไฟล์ที่ปฏิบัติการได้; และไม่สามารถค้นหา"echo 'A' 'B'"
เป็นไฟล์ได้
ในกรณีใด ๆ ในบริบทของgit help config
ใบเสนอราคาข้างต้นฉันคาดการณ์ว่ามีความแม่นยำมากกว่าที่จะระบุสิ่งที่ชอบ: " ... การร้องขอ" git new "เทียบเท่ากับการใช้คำสั่งเชลล์" gitk --all --not ORIG_HEAD $ @ "โดยที่ $ @ เป็นอาร์กิวเมนต์ที่ส่งไปยังนามแฝงคำสั่ง git จากบรรทัดคำสั่งตอนรันไทม์ ... " ฉันคิดว่านั่นจะอธิบายได้ว่าทำไมวิธี "โดยตรง" ใน OP ไม่ทำงานกับพารามิเตอร์ตำแหน่ง
$1
ควรใช้งานได้)