เมื่อฉันใช้ shebang #!/usr/bin/env python
เพื่อเรียกใช้สคริปต์ระบบจะทราบได้อย่างไรว่าpython
ควรใช้อย่างไร ถ้าฉันค้นหาpython
เส้นทางถังในตัวแปรสภาพแวดล้อมฉันไม่พบอะไรเลย
env | grep -i python
เมื่อฉันใช้ shebang #!/usr/bin/env python
เพื่อเรียกใช้สคริปต์ระบบจะทราบได้อย่างไรว่าpython
ควรใช้อย่างไร ถ้าฉันค้นหาpython
เส้นทางถังในตัวแปรสภาพแวดล้อมฉันไม่พบอะไรเลย
env | grep -i python
คำตอบ:
shebang ต้องการเส้นทางแบบเต็มไปยังล่ามเพื่อใช้ดังนั้นไวยากรณ์ต่อไปนี้จะไม่ถูกต้อง:
#!python
การตั้งค่าเส้นทางแบบเต็มเช่นนี้อาจใช้งานได้:
#!/usr/local/bin/python
แต่จะไม่ใช่อุปกรณ์พกพาเนื่องจากอาจติดตั้งไพ/bin
ธ/opt/python/bin
อนหรือตำแหน่งอื่นใดก็ได้
การใช้ env
#!/usr/bin/env python
เป็นวิธีการที่ช่วยให้วิธีแบบพกพาเพื่อระบุระบบปฏิบัติการเส้นทางแบบเต็มเทียบเท่ากับหนึ่งที่ตั้งอยู่เป็นครั้งแรกในpython
PATH
shebangบรรทัด (จาก“ปังคม” คือ#!
) การประมวลผลโดยเคอร์เนล PATH
เคอร์เนลไม่ต้องการที่จะรู้เกี่ยวกับตัวแปรสภาพแวดล้อมเช่น ดังนั้นชื่อบนบรรทัด shebang ต้องเป็นพา ธ สัมบูรณ์ไปยังไฟล์ที่เรียกทำงานได้ คุณยังสามารถระบุอาร์กิวเมนต์เพิ่มเติมเพื่อส่งไปยังไฟล์เรียกใช้งานนั้นก่อนชื่อสคริปต์ (ด้วยข้อ จำกัด ที่ขึ้นกับระบบฉันจะไม่เข้าไปที่นี่) ตัวอย่างเช่นสำหรับสคริปต์ Python คุณสามารถระบุได้
#!/usr/bin/python
/usr/bin/python /path/to/script
ในบรรทัดแรกและเมื่อคุณรันสคริปต์เคอร์เนลจะดำเนินการในความเป็นจริง แต่นั่นไม่สะดวก: คุณต้องระบุเส้นทางแบบเต็มของคำสั่ง ถ้าคุณมีpython
ใน/usr/bin
บางเครื่องและ/usr/local/bin
อื่น ๆ ? หรือคุณต้องการตั้งค่าของคุณPATH
ไป/home/joe/opt/python-2.5/bin
เพื่อที่จะใช้รุ่นที่เฉพาะเจาะจงของงูใหญ่? เนื่องจากเคอร์เนลจะไม่ทำการPATH
ค้นหาสำหรับคุณความคิดคือการทำให้เคอร์เนลรันคำสั่งที่จะค้นหาล่ามที่ต้องการในPATH
:
#!/fixed/path/to/path-lookup-command python
ที่path-lookup-command
จะต้องใช้ชื่อของปฏิบัติการเป็นอาร์กิวเมนต์และมองมันได้ในและดำเนินการมันเคอร์เนลจะทำงานPATH
/fixed/path/to/path-lookup-command python /path/to/script
เมื่อมันเกิดขึ้นenv
คำสั่งก็ทำเช่นนั้น วัตถุประสงค์หลักของมันคือการเรียกใช้คำสั่งที่มีสภาพแวดล้อมที่แตกต่างกัน แต่เนื่องจากมันค้นหาชื่อคำสั่ง$PATH
มันจึงเหมาะสำหรับวัตถุประสงค์ของเราที่นี่
แม้ว่าจะไม่รับประกันอย่างเป็นทางการระบบ Unix ประวัติศาสตร์ที่จัดไว้ให้env
ในและระบบที่ทันสมัยได้เก็บสถานที่ที่แม่นยำเพราะใช้อย่างแพร่หลายของ/usr/bin
#!/usr/bin/env
ดังนั้นในทางปฏิบัติวิธีการระบุว่าสคริปต์ต้องถูกดำเนินการโดย Python interpreter ที่ผู้ใช้ชื่นชอบ
#!/usr/bin/env python
env
และwhich
? ตั้งแต่ที่จะได้รับการปฏิบัติที่มีสิทธิ์มากที่สุดจากสภาพแวดล้อมเส้นทางของฉัน
which
ค้นหาไฟล์สั่งการและพิมพ์พา ธ env
ค้นหาโปรแกรมที่ระบุโดยอาร์กิวเมนต์แรกและเรียกใช้งานโดยส่งผ่านอาร์กิวเมนต์ที่เหลือ
env
จึงเป็นรุ่น Eval ของwhich
หลัก
ถูกต้องแล้วเรียกใช้:
env | grep PATH
$ PATH ของคุณคือรายการไดเรกทอรี Unix จะผ่านรายการไดเรกทอรีตามลำดับจนกระทั่งพบ "python"
คุณสามารถดูว่าไดเรกทอรีใดที่ค้นหาด้วยคำสั่ง 'which':
which python
sys.path
ระหว่าง env $ env python3
( ['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
) และ./env/bin/python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']
) ที่เปิดใช้งาน