ติดตามพารามิเตอร์บางอย่างในคำสั่งบางอย่าง


10

สมมติว่าฉันมีคำสั่งgit branch(เช่นมีคำสองคำ) เสมอ

สิ่งที่ฉันต้องการคือการติดตามเมื่อคำสั่งนี้จะถูกดำเนินการกับข้อโต้แย้ง ตัวอย่างเช่นถ้าฉันรันคำสั่งgit branch developโดยไม่มีข้อผิดพลาดฉันต้องการบันทึกdevelopไฟล์

ฉันพยายามเขียนทับคำสั่ง git บนของฉัน.bash_profileบางอย่างเช่นนี้:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

แต่ดูเหมือนว่าใช้งานไม่ได้ดี มีวิธีการทำเช่นนี้?


ตามตัวอย่างของคุณ (พัฒนาสาขา git) คุณต้องการตรวจสอบว่า "$ #" คือ "2" และไม่ใช่ "3" หรือไม่? ... (2 พารามิเตอร์สำหรับฟังก์ชั่นคอมไพล์)
Olivier Dulac

เป็นความผิดพลาด แต่รหัสเป็นเพียงตัวอย่าง
jherran

ตกลง. ฉันเพิ่มหมายเหตุเพิ่มเติมภายใต้คำตอบ (ดี) ของ Stephane หมายเหตุของฉันอาจใช้ไม่ได้ (ฉันคิดว่า. txt เป็นไฟล์บันทึก แต่อาจเป็นอย่างอื่นที่ไม่มีวันที่ใช่หรือไม่)
Olivier Dulac

คำตอบ:


18

คุณมีปัญหาเล็กน้อยที่นี่:

  • gitฟังก์ชั่นของคุณกำลังเรียกตัวเองซ้ำ ๆ แทนที่จะเป็นgitคำสั่งเดิม
  • คุณกำลังใช้$@ข้อความที่ไม่ได้ให้คำตอบ แต่อย่างใด
  • คุณกำลังปล่อยตัวแปรอื่นไว้โดยไม่มีการขอให้เชลล์แบ่ง + glob
  • คุณกำลังใช้echoข้อมูลโดยพลการ
  • คุณกำลังสูญเสียสถานะการออกของgitคำสั่งดั้งเดิม
  • คุณกำลังเขียนทับไฟล์บันทึกของคุณเมื่อทำการร้องขอแต่ละครั้ง
  • คุณใส่คำจำกัดความของฟังก์ชั่นในของคุณ~/.bash_profileซึ่งจะหมายถึงการปรับแต่งเซสชั่นการเข้าสู่ระบบของคุณไม่ใช่เปลือกของคุณและเป็นปกติไม่อ่านได้โดยที่ไม่ได้เข้าสู่ระบบbashสวด

คุณต้องการสิ่งที่ต้องการ:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

นั่นคือ:

  • พูดตัวแปรของคุณ
  • ใช้commandในการเรียกใช้git คำสั่ง ,
  • บันทึกสถานะการออกของgitในตัวแปรท้องถิ่นและส่งคืนเมื่อออก
  • ใช้>>แทน>การเปลี่ยนเส้นทางไปยังไฟล์บันทึก
  • ใช้แทนprintfecho
  • และใส่ไว้ในของคุณ~/.bashrcแทน (ตรวจสอบให้แน่ใจว่าคุณ~/.bash_profileได้จัดหา~/.bashrcเป็นbashเชลล์ล็อกอินไม่ได้อ่าน~/.bashrcตามค่าเริ่มต้น ( bashข้อผิดพลาด / การป้อนผิด) ถ้าคุณไม่ต้องการส่งออกgitฟังก์ชัน (พร้อมexport -f git) ในกรณีที่คุณต้องการbashสคริปต์ที่เรียกgitเพื่อเรียกใช้ฟังก์ชันนั้น

1
คำอธิบายที่น่าอัศจรรย์และใช้งานได้อย่างมีเสน่ห์ ขอบคุณมาก.
jherran

+1 สำหรับคำตอบที่ดีมาก แต่ op อาจต้องการเปลี่ยนการตรวจสอบ[ "$#" -eq 2 ]ตามตัวอย่างของเขา และควรเพิ่มวันที่ใน "tacked_parameters.txt" ด้วยเช่นกัน และฉันต้องการไปสำหรับกรณีทั่วไป (คือไม่ได้เป็นเพียงการติดตามของพารามิเตอร์ที่ 2 เมื่อ 2 พารามิเตอร์ แต่ติดตามพารามิเตอร์ใด ๆ ): ฉันต้องการกำจัดถ้าและได้: printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"? (เช่นแสดงคำสั่ง + พารามิเตอร์ทั้งหมด (โปรดทราบว่าคุณยังคงสูญเสียข้อมูลบางอย่างเช่นพารามิเตอร์ที่มีตัวคั่นภายในถ้ามี) วันที่พกพาใกล้กับมาตรฐาน iso8601)
Olivier Dulac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.