“ sh” ต้องอยู่ในไดเรกทอรี“ / bin” หรือไม่


16

ฉันได้อ่านแล้วว่าระบบปฏิบัติการที่รองรับ POSIX (ตัวอย่างเช่น: Linux) ต้องมีshเชลล์

แต่จำเป็นต้องshอยู่ใน/binไดเรกทอรีหรืออยู่ในไดเรกทอรีใด ๆ


คุณสามารถใช้ symlink เป็น/bin/shส่วนใหญ่ใน linux มันเป็น symlink ไปbashแล้ว มันเป็นเพียงว่าจำนวนมากสคริปต์ใช้ hardcoded/bin/sh
cylgalad

5
ตอนนี้คุณมีคำตอบว่ามันสามารถอยู่ได้ทุกที่ที่คุณต้องการคุณอาจถามตัวเองว่า: แล้วคุณจะเขียนบรรทัด Shebang ได้shอย่างไร? และคำตอบก็คือ: shebang ไม่ได้เป็นส่วนหนึ่งของ POSIX เช่นกันดังนั้นปัญหาก็ยังไม่เกิดขึ้น
Jörg W Mittag

1
@ JörgWMittagใช่บางครั้งมันก็น่าแปลกใจที่หลายสิ่งที่เราคิดว่าเป็นคุณสมบัติ "มาตรฐาน" ของ Unix นั้นไม่ได้ต้องการโดย POSIX
Barmar

1
ไม่ว่าคุณจะใช้ shebang หรือไม่นั้นขึ้นอยู่กับว่าเส้นทางนั้น/bin/shต้องมีอยู่ในระบบ POSIX หรือไม่
chepner

อย่างน้อยในระบบอูบุนตูที่ได้มาจากการเชื่อมโยงไปยัง/bin/sh dashเมื่อวันที่ BSDs ที่/bin/shไม่ได้เป็นของการเชื่อมโยง bashแต่ปฏิบัติการที่แยกต่างหากและไม่แน่นอน
Rhialto สนับสนุนโมนิก้า

คำตอบ:


22

POSIX เพียงเอกสารที่/devและ/tmpไดเรกทอรีที่จะอยู่และ/dev/null, /dev/ttyและ/dev/consoleไฟล์ ต้องมีสาธารณูปโภคมาตรฐาน แต่ไม่มีการระบุตำแหน่งที่ตั้งเฉพาะ มีอาจจะไม่เป็น/binที่ทั้งหมดและถ้ามีก็ไม่อาจมีshและถ้ามันไม่ว่าอาจจะไม่ shPOSIX

คุณสามารถรับPATHตัวแปรที่ถูกต้องซึ่งรวมถึงเครื่องมือ POSIX รวมถึงshด้วยgetconfคำสั่ง :

$ PATH=$(getconf PATH)
$ sh

สิ่งนี้มีประโยชน์ในตัวอย่างเช่น Solaris โดยที่ค่าดีฟอลต์shไม่สามารถทำงานร่วมกับ POSIX ได้แต่มีการshจัดเตรียมและเข้าถึงได้ตามวิธีนั้น (เนื่องจากSolaris เป็น Unix ที่ได้รับการรับรอง ) getconf PATHจะรวม/usr/xpg4/binที่ด้านหน้าซึ่งมี POSIX shและเครื่องมืออื่น ๆ ที่จำเป็นจำนวนหนึ่ง ( รวมถึงcdเครื่องมือที่ไม่มีประโยชน์เช่น )


Re Solaris: ... เว้นแต่ว่าคุณกำลังติดตั้ง Solaris "เซิร์ฟเวอร์ขนาดเล็ก" ซึ่งไม่ใช้เครื่องมือ POSIX จำนวนมาก ดูunix.stackexchange.com/q/360359/135943
Wildcard

คน "ไร้ประโยชน์"? ฉันควรจะเรียกพวกเขาว่าซ้ำซ้อน
Mukesh Sai Kumar

2
ดังนั้นจะพบว่า getconf อย่างไร
Joshua

@MukeshSaiKumar คำสั่ง 'cd' แบบสแตนด์อโลนไม่สามารถใช้งานได้
OrangeDog

มันจะ "ทำงาน" เพียงเพื่อคุณค่าของการทำงานที่พูดทดสอบว่าคุณสามารถเปลี่ยนเป็นไดเรกทอรีได้หรือไม่ แต่ไม่ทิ้งกระบวนการที่เรียกว่ามีอยู่จริง แต่นั่นเป็นฟังก์ชั่นที่มากกว่าใคร ๆ
Charles Duffy

12

ไม่มีก็ไม่จำเป็นสำหรับการที่จะอยู่ในsh /binมันชัดเจนอ้างอิง/bin, /usr/binและ/usr/xpg4/binเป็นสถานที่ที่เป็นไปได้ ข้อมูลจำเพาะ POSIX ต้องการเพียงว่าshอยู่ในเส้นทาง

POSIX สเป็ฯ :

การประยุกต์ใช้งานควรทราบว่าเส้นทางมาตรฐานเพื่อเปลือกไม่สามารถสันนิษฐานว่าจะเป็นอย่างใดอย่างหนึ่ง/bin/shหรือ/usr/bin/shและควรถูกกำหนดโดยการสอบสวนของเส้นทางที่ส่งกลับโดยเส้นทาง getconf เพื่อให้มั่นใจว่าชื่อพา ธ กลับมาเป็นชื่อพา ธ แน่นอนและไม่เปลือกในตัว

ตัวอย่างเช่นการกำหนดตำแหน่งของยูทิลิตี sh มาตรฐาน:

command -v sh

ในการใช้งานบางอย่างนี้อาจกลับมา:

/usr/xpg4/bin/sh


2

ตามที่คนอื่น ๆ ที่นี่ได้กล่าวว่าสิ่งนี้ไม่จำเป็นสำหรับการปฏิบัติตาม POSIX อย่างเคร่งครัด

แต่ความเข้ากันได้ของเนื้อหากับซอฟต์แวร์ที่มีอยู่นั้นมีความสำคัญมากกว่า (ท้ายที่สุดแล้ววัตถุประสงค์ของ POSIX คือการให้บางสิ่งบางอย่างทำงานได้กับทุกระบบปฏิบัติการที่สอดคล้องกัน) และหากระบบปฏิบัติการไม่ได้จัดเตรียม/bin/shไว้

เห็นได้ชัดว่าสคริปต์ที่#!/bin/shใช้เส้นทางนี้เป็นมาตรฐาน สิ่งนี้ไม่จำเป็นในการทำงาน POSIX ไม่ต้องการแม้แต่#!บรรทัดที่ได้รับการสนับสนุนแม้ว่าจะระบุว่าฟังก์ชันดังกล่าวเป็นเรื่องปกติ :

อีกวิธีหนึ่งที่การประยุกต์ใช้ในอดีตจัดการกับเชลล์สคริปต์คือการรับรู้สองไบต์แรกของไฟล์เป็นสตริงอักขระ "#!" และใช้ส่วนที่เหลือของบรรทัดแรกของไฟล์เป็นชื่อของล่ามคำสั่งที่จะดำเนินการ

แต่หากไม่ได้รับการสนับสนุนซอฟต์แวร์จำนวนมากที่มีอยู่จะหยุดทำงานหรือต้องทำงานเพิ่มเติมในพอร์ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.