ปัญหาต่อไปนี้: ฉันมีสคริปต์นี้ foo.py
และหากผู้ใช้เรียกใช้สคริปต์โดยไม่มีตัวเลือก --bar
ฉันต้องการแสดงข้อความแสดงข้อผิดพลาดต่อไปนี้:
Please add the --bar option to your command, like so:
python foo.py --bar
ตอนนี้ส่วนที่ยุ่งยากก็คือมีหลายวิธีที่ผู้ใช้อาจเรียกใช้คำสั่ง:
- พวกเขาอาจใช้
python foo.py
เหมือนในตัวอย่าง - พวกเขาอาจจะใช้
/usr/bin/foo.py
- พวกเขาอาจมีเชลล์นามแฝง
frob='python foo.py'
และรันจริง ๆfrob
- บางทีมันอาจเป็นนามแฝง git
flab=!/usr/bin/foo.py
และพวกเขาใช้git flab
ในทุกกรณี ฉันต้องการให้ข้อความสะท้อนถึงวิธีที่ผู้ใช้เรียกใช้คำสั่ง เพื่อให้ตัวอย่างที่ฉันให้นั้นสมเหตุสมผล
sys.argv
มี foo.py
เสมอ และ /proc/$$/cmdline
ไม่ทราบเกี่ยวกับนามแฝง สำหรับฉันดูเหมือนว่าแหล่งที่มาเดียวที่เป็นไปได้สำหรับข้อมูลนี้ก็คือการทุบตีเอง แต่ฉันไม่รู้จะถามอย่างไร
มีความคิดอะไรบ้าง?
อัปเดต แล้วถ้าเราจำกัดสถานการณ์ที่เป็นไปได้ไว้เฉพาะรายการข้างต้นล่ะ
อัปเดต 2: มีคนจำนวนมากเขียนคำอธิบายที่ดีมากเกี่ยวกับสาเหตุที่เป็นไปไม่ได้ในกรณีทั่วไป ดังนั้นฉันอยากจะจำกัดคำถามของฉันไว้เพียงสิ่งนี้:
ภายใต้สมมติฐานต่อไปนี้:
- สคริปต์เริ่มต้นแบบโต้ตอบจากทุบตี
- The script was start in one of these 3 ways:
foo <args>
where foo is a symbolic link /usr/bin/foo -> foo.pygit foo
โดยที่ alias.foo=!/usr/bin/foo ใน~/.gitconfig
git baz
โดยที่ alias.baz=!/usr/bin/foo ใน~/.gitconfig
มีวิธีแยกแยะระหว่าง 1 ถึง (2,3) จากภายในสคริปต์หรือไม่? มีวิธีแยกแยะระหว่าง 2 และ 3 จากภายในสคริปต์หรือไม่?
ฉันรู้ว่านี่เป็นเรื่องไกลตัว ดังนั้นตอนนี้ฉันจึงยอมรับคำตอบของชาร์ลส ดัฟฟี่
อัปเดต 3: จนถึงตอนนี้ Charles Duffy แนะนำมุมที่มีแนวโน้มมากที่สุดในความคิดเห็นด้านล่าง ถ้าฉันสามารถทำให้ผู้ใช้ของฉันมี
trap 'export LAST_BASH_COMMAND=$(history 1)' DEBUG
ใน .bashrc
ของพวกเขา ฉันสามารถใช้สิ่งนี้ในโค้ดของฉัน:
like_so = None
cmd = os.environ['LAST_BASH_COMMAND']
if cmd is not None:
cmd = cmd[8:] # Remove the history counter
if cmd.startswith("foo "):
like_so = "foo --bar " + cmd[4:]
elif cmd.startswith(r"git foo "):
like_so = "git foo --bar " + cmd[8:]
elif cmd.startswith(r"git baz "):
like_so = "git baz --bar " + cmd[8:]
if like_so is not None:
print("Please add the --bar option to your command, like so:")
print(" " + like_so)
else:
print("Please add the --bar option to your command.")
ด้วยวิธีนี้ ฉันจะแสดงข้อความทั่วไปหากฉันไม่สามารถรับวิธีการร้องขอได้ แน่นอน หากฉันต้องอาศัยการเปลี่ยนแปลงสภาพแวดล้อมของผู้ใช้ ฉันอาจตรวจสอบให้แน่ใจด้วยว่านามแฝงต่างๆ ส่งออกตัวแปรสภาพแวดล้อมของตัวเองที่ฉันสามารถดูได้ แต่อย่างน้อยวิธีนี้ทำให้ฉันสามารถใช้เทคนิคเดียวกันสำหรับ สคริปต์อื่นที่ฉันอาจเพิ่มในภายหลัง
history 1
อาจจะเพียงพอแล้วเหรอ? - person Aaron   schedule 12.07.2018--bar
เป็นข้อบังคับ ลองเพิ่มเข้าไปภายในตัวคุณเองอยู่เสมอ และจัดเตรียม--no-bar
ให้กับผู้ใช้ที่มีทักษะมากกว่าที่ไม่ต้องการและรู้วิธีเพิ่มอาร์กิวเมนต์ - person Mark Setchell   schedule 12.07.2018git rebase
พบข้อขัดแย้ง ดังนั้นความคิดของคุณจะไม่ได้ผลสำหรับฉัน - person itsadok   schedule 12.07.2018Please add the --bar option to your command, like so: 'cmd --bar'
คนส่วนใหญ่ฉลาดพอที่จะรู้ว่าcmd
เป็นส่วนเติมเต็มสำหรับสิ่งที่พวกเขาพิมพ์ - person dawg   schedule 18.07.2018BASH_COMMAND
ไปยังสภาพแวดล้อมจากกับดักDEBUG
แต่ถ้าคุณเชื่อถือสิ่งนั้น โปรแกรมของคุณจะมีพฤติกรรมในมือเมื่อถูกเรียกใช้โดย เปลือกเตรียมไว้อย่างดี...จึงดูไม่ค่อยมีประโยชน์ - person Charles Duffy   schedule 19.07.2018git
ใช่ คุณสามารถทำได้ ไม่พบนามแฝง Shell ที่ใดก็ได้ในประวัติ แต่เนื่องจากการเรียกใช้นามแฝง git ต้องใช้คำสั่งภายนอกจริง จึงจะปรากฏขึ้น - person Charles Duffy   schedule 19.07.2018argv[0]
ใช้งานได้สำหรับพวกเขา โดยเป็นสื่อกลางผ่าน/proc/self/cmdline
หรืออย่างอื่น) - person Charles Duffy   schedule 19.07.2018