เปอร์เซ็นต์ในตัวแปรสภาพแวดล้อม $ PATH


16

$ PATH ของฉันมีลักษณะดังนี้:

/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

ในทุบตีฉันสามารถไม่มีปัญหาเรียกคันตั้งอยู่ใน

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

ชอบ

$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed"  -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template

อย่างไรก็ตามในโหมดความเข้ากันได้ของเชลล์ bourne ไม่พบไม้กายสิทธิ์:

$ wand
sh: 2: wand: not found

ดูเหมือนว่าปัญหาคือเครื่องหมาย% ในพา ธ เหล่านี้ เครื่องหมายนี้ได้รับการเพิ่มโดยการเข้ารหัส URL เพื่อให้สามารถใช้ชื่อ "GNU / Linux" ในชื่อไดเรกทอรีได้แม้ว่าจะไม่ใช่ชื่อไฟล์ที่ถูกต้องก็ตาม เป็นไปได้หรือไม่ที่จะทำให้ชื่อทำงานเป็น sh หรือทำให้คำสั่ง sh ทำงานเป็น bash นั่นคือทำให้ bash ทำงานเหมือนกันแม้ว่าจะถูกเรียกใช้ด้วยคำสั่ง / bin / sh ซึ่ง symlink จะทุบตีอยู่ดี


เป็นคำถามที่ดี ดูเหมือนว่าอักขระ '%' จะทำงานไม่ถูกต้องใน $ PATH จากsh(มันก็โอเคbashและzshแม้ว่า) โดยตรงเรียกงานปฏิบัติการในsh; แปลกจริงๆ
Rmano

จะเกิดอะไรขึ้นถ้าคุณใช้ 2 %%
mikeserv

หรือหลบหนี%
mdpc

คำตอบ:


15

นั่นไม่ใช่เปลือก Bourne หรือbashเลียนแบบเปลือก Bourne นั่นคือเปลือก Almquist ในกรณีของคุณอาจเป็นเชลล์ Debian Almquist (ส้อม Linux โดย Debian ของ BSDs เองตามเชลล์ Almquist ดั้งเดิม)

ใน Almquist เปลือก (คนเดิมและรุ่นที่ทันสมัย) %ถูกนำมาใช้ในสำหรับคุณสมบัติพิเศษที่เฉพาะเจาะจงเพื่อPATH ashการอ้างอิงจากเอกสาร:

การค้นหาเส้นทาง

เมื่อค้นหาคำสั่งเชลล์จะดูเพื่อดูว่ามีเชลล์ฟังก์ชันตามชื่อนั้นหรือไม่ จากนั้นหาก PATH ไม่มีรายการ %builtinก็จะค้นหาคำสั่ง builtin โดยใช้ชื่อนั้น ในที่สุดมันจะค้นหาแต่ละรายการใน PATH เพื่อหาคำสั่ง

ค่าของตัวแปร PATH ควรเป็นชุดรายการที่คั่นด้วยเครื่องหมายโคลอน แต่ละรายการประกอบด้วยชื่อไดเรกทอรีหรือชื่อไดเรกทอรีตามด้วยการตั้งค่าสถานะเริ่มต้นด้วยเครื่องหมายเปอร์เซ็นต์ ไดเรกทอรีปัจจุบันควรระบุด้วยชื่อไดเรกทอรีว่าง หากไม่มีเครื่องหมายเปอร์เซ็นต์แสดงว่ารายการทำให้เชลล์ค้นหาคำสั่งในไดเร็กทอรีที่ระบุ หากแฟล็กเป็น%builtin รายการของคำสั่ง shell builtin จะถูกค้นหา ถ้าเป็นธง %func นั้นไดเร็กทอรีจะถูกค้นหาไฟล์ซึ่งถูกอ่านเป็นอินพุตไปยังเชลล์ ไฟล์นี้ควรกำหนดฟังก์ชั่นที่มีชื่อเป็นชื่อของคำสั่งที่จะค้นหา

ชื่อคำสั่งที่มีเครื่องหมายสแลชจะดำเนินการโดยไม่ต้องทำการค้นหาใด ๆ ข้างต้น

เชลล์อื่น ๆ ชอบkshหรือzshมีกลไกการทำงานแบบอัตโนมัติที่คล้ายกัน แต่พวกมันใช้ตัวแปรที่แตกต่างกัน$FPATH ) แต่คุณไม่สามารถกำหนดได้ว่าฟังก์ชั่นหรือไฟล์ปฏิบัติการใดที่สำคัญกว่า

ในกรณีของคุณ/home/torbjorr/deployed/vector/x86_64-GNU%2fLinuxถูกตีความว่าเป็น/home/torbjorr/deployed/vector/x86_64-GNUไดเรกทอรีที่มี2fLinuxธง การตั้งค่าสถานะนั้นจะถูกละเว้นเนื่องจากไม่เป็นที่รู้จัก

ไม่มีทางรอบนั้น แม้ว่าเถ้าจะมีกลไกหลบหนีเพื่อที่%จะไม่ได้รับการปฏิบัติเป็นพิเศษมันก็จะไม่ทำงานในเปลือกหอยอื่น ๆ หรือสิ่งอื่น ๆ ที่มีลักษณะ$PATHเหมือนexecvp()กัน

คุณจะต้องลบ%อักขระออกจาก$PATHนั้นเปลี่ยนชื่อไดเรกทอรีของคุณหรือเพิ่ม symlink

หรือไม่ได้ใช้สำหรับคุณash /bin/shน้ำหนักเบาใช้งาน POSIX เปลือกอื่น ๆ ที่ไม่ได้ทำที่รวมและyashmksh


แม้ว่าคำตอบนี้จะให้คำอธิบาย แต่ก็ไม่ได้ให้คำตอบ มีวิธีการรักษา%
user877329

@ user877329 ไม่มีวิธีแก้ปัญหาจริงที่นี่ ดูการแก้ไขของฉัน
Stéphane Chazelas

3
เดเบียนshละเมิดมาตรฐาน POSIX ระบุว่าจุดที่มีการแยกต่างหากshคือว่าคุณควรแน่ใจว่าจะไม่เดินทางข้ามส่วนขยายของเชลล์ที่เข้ากันไม่ได้ (ฉันเดาว่าไม่มีใครใช้/bin/shเป็นชื่อล็อกอินเชลล์ในปัจจุบัน) ฉันคิดว่าเป็นข้อผิดพลาด
celtschk

1
@celtschk ตกลงแม้ว่าจุดของการใช้ashสำหรับ bin / sh / มีมากขึ้นเพื่อหลีกเลี่ยงการลงโทษประสิทธิภาพของการใช้bashเพื่อใช้yashหรือmksh(หรือposhถ้าคุณต้องการที่จะไม่รวมส่วนขยายทั้งหมด) bashก็ยังคงเป็นตัวเลือกที่ดีกว่าการใช้ นอกจากนี้หนึ่งอาจพิจารณาเป็นกรณีมุม ปกติจะไม่มีใคร%อยู่ในองค์ประกอบของเส้นทาง กระสุนส่วนใหญ่มีตัวเรือนมุมที่ไม่เข้ากับ POSIX
Stéphane Chazelas

1
@tmiller นั่นไม่ใช่วิธีที่ฉันอ่านความหมายของชุดอักขระชื่อไฟล์แบบพกพา (PFCS) POSIX ระบุ API การเขียนโปรแกรม แต่ไม่ใช้งานระบบไฟล์ PFCS คือการรับประกัน POSIX ขั้นต่ำจะทำงานกับระบบไฟล์ไม่ว่าโลแคลใดในปัจจุบัน แต่จะไม่มีข้อแก้ตัวสำหรับเครื่องมือที่จะไม่ยอมรับอักขระในชื่อไฟล์ถ้าระบบไฟล์รองรับและใช้ได้ในโลแคลปัจจุบัน โปรดทราบว่าสำหรับอินสแตนซ์ POSIX ต้องมี[คำสั่งแม้ว่าอักขระนั้นไม่ได้อยู่ใน PFCS
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.