การใช้ / bin / sh ใน hashbang นั้นถูกต้องหรือไม่หากเชลล์เป้าหมายไม่สามารถใช้งานได้


15

#!/bin/shโดยทั่วไปเชลล์สคริปต์มีความคิดเห็นต่อไปนี้ที่บรรทัดแรกของไฟล์สคริปต์: จากการวิจัยที่ฉันทำมันเรียกว่า "hash bang" และมันเป็นความเห็นทั่วไป /binความคิดเห็นนี้แจ้งยูนิกซ์ว่าไฟล์นี้จะถูกดำเนินการโดยบอร์นเชลล์ภายใต้ไดเรกทอรี

คำถามของฉันเริ่มต้นในจุดนั้น #!/bin/bashถึงตอนนี้ฉันไม่ได้เห็นความคิดเห็นนี้เช่น #!/bin/shมันก็มักจะ อย่างไรก็ตามการแจกแจง Ubuntu ไม่มีโปรแกรม Bourne Shell พวกเขามี Bourne Again Shell (ทุบตี)

ในจุดนั้นถูกต้องหรือไม่ที่จะแสดงความคิดเห็น#!/bin/shในเชลล์สคริปต์ที่เขียนในการแจกแจงของ Ubuntu?



1
ดูคำตอบของฉันกับคำถามนี้ ServerFault: ! # / bin / ดวลจุดโทษ VS # / bin / ทุบตีสูงสุดสำหรับการพกพา
Gordon Davisson

โดยทั่วไปเรียกว่าshebang
fpmurphy

คำตอบ:


16

#!/bin/shควรทำงานกับ Unix และ Unix-like distributions ทั้งหมด โดยทั่วไปถือว่าเป็น hashbang ที่พกพาได้มากที่สุดตราบใดที่สคริปต์ของคุณยังคงเป็นไปตาม POSIX /bin/shเปลือกควรจะเป็นเปลือกที่ใช้มาตรฐาน POSIX เปลือกไม่คำนึงถึงสิ่งที่เกิดขึ้นจริงเปลือกคือสวมหน้ากากที่เป็น/bin/shเปลือก


#!/bin/shโดยปกติจะเป็นเพียงลิงก์ในขณะนี้เนื่องจากเชลล์เป้าหมายไม่ได้รับการดูแล ในระบบ Unix จำนวนมาก/bin/shจะเป็นลิงก์ไปยัง/bin/kshหรือ/bin/ashบนระบบ Linux ที่ใช้ RHEL จำนวนมากมันจะเป็นลิงค์ไปยัง/bin/bashอย่างไรก็ตามบน Ubuntu และระบบที่ใช้เดเบียนหลายตัวที่เชื่อมโยงกับ/bin/dashมัน เชลล์ทั้งหมดเมื่อถูกเรียกใช้shจะเข้าสู่โหมดความเข้ากันได้ POSIX

hashbang เป็นตัวยึดตำแหน่งที่สำคัญเนื่องจากช่วยให้พกพาได้ดีกว่าวิธีอื่น ๆ ตราบใดที่สคริปต์ของคุณสอดคล้องกับ POSIX อย่างเคร่งครัด (ซ้ำกับความสำคัญของความเครียด)

หมายเหตุ: เมื่อbashถูกเรียกใช้ในโหมด POSIX มันจะยังคงอนุญาตให้ทำสิ่งที่ไม่ใช่ POSIX เช่น[[อาร์เรย์และอื่น ๆ สิ่งเหล่านั้นอาจล้มเหลวในbashระบบที่ไม่ใช่


3
"บน Ubuntu เป็นลิงก์ไปยัง / bin / dash" และโดยทั่วไปแล้วระบบที่ใช้ Debian อื่น ๆ IIRC บน FreeBSD / GhostBSD มันเป็น symlink /bin/ashด้วยเช่นกัน
Sergiy Kolodyazhnyy

ในการพกพาได้อย่างเต็มที่ให้เว้นช่องว่างระหว่าง shebang และเส้นทาง (ล่าม) สำหรับล่าม บางระบบมองหาแทนเพียง#! / #!
Simon Richter

5
@SimonRichter การอ้างอิงสำหรับสิ่งนี้จะดีที่จะเห็น
Kusalananda

@SergiyKolodyazhnyy เวอร์ชันที่ติดตั้งของ sh บน FreeBSD นั้นเป็นเถ้าและไม่ใช่ symlink
Rob

2
@ Kusalananda อืมหน้านี้บอกว่านี่เป็นเรื่องโกหกดังนั้นมันอาจจะถูกมองข้ามไป
Simon Richter

12

คุณได้รับมันย้อนหลัง /bin/shแทบจะไม่เคยเป็นเชลล์เป้าหมายในทุกวันนี้และเมื่อไรที่คุณมีปัญหาเมื่อใช้#! /bin/shshe-bang

เชลล์เป้าหมายเป็นเชลล์ที่เขียนในช่วงปลายยุค 70 และแทนที่เชลล์ ธ อมป์สันก่อนหน้านี้ (เรียกอีกอย่างว่าsh) ในช่วงต้นทศวรรษที่ 80 David Korn เขียนส่วนขยายสำหรับเชลล์เป้าหมายขึ้นเล็กน้อยแก้ไขข้อบกพร่องบางประการและออกแบบความอึดอัดใจ (และแนะนำบางอย่าง) และเรียกมันว่า Korn เชลล์

ในช่วงต้น 90s, POSIX ระบุsh ภาษาตามชุดย่อยของ Korn เชลล์และระบบส่วนใหญ่ตอนนี้เปลี่ยน/bin/shเป็น Korn เชลล์หรือเป็นไปตามข้อกำหนดของสเปคนั้น ในกรณีของ BSD พวกเขาค่อย ๆ เปลี่ยน/bin/shในขั้นต้น (หลังจากพวกเขาไม่สามารถใช้เชลล์บอร์นสำหรับเหตุผลด้านลิขสิทธิ์อีกต่อไป) เชลล์ Almquist ซึ่งเป็นโคลนนิ่งเชลล์บอร์นที่มีนามสกุล ksh บางส่วนจึงกลายเป็น POSIX ที่สอดคล้องกัน

ทุกวันนี้ระบบ POSIX ทั้งหมดมีเชลล์ชื่อsh(ส่วนใหญ่ แต่ไม่จำเป็นต้องมีใน/binPOSIX ไม่ได้ระบุพา ธ ของยูทิลิตีที่ระบุ) ซึ่งส่วนใหญ่เป็นไปตาม POSIX โดยทั่วไปแล้วจะขึ้นอยู่กับ ksh88, ksh93, pdksh, bash, ash หรือzsh² แต่ไม่ใช่เชลล์ Bourne เนื่องจากเชลล์ Bourne ไม่รองรับ POSIX ไม่กี่ของเปลือกหอยเหล่านั้น ( bash, zsh, yashและบางpdkshอนุพันธ์เปิดใช้งานโหมด POSIX สอดคล้องเมื่อเรียกเป็นshและน้อยตามมาตรฐานอื่น ๆ )

bash(คำตอบของ GNU ต่อ Korn เชลล์) เป็นจริงของโอเพ่นซอร์สเชลล์เท่านั้น (และใคร ๆ ก็สามารถพูดได้ว่าปัจจุบันได้รับการบำรุงรักษาเท่านั้นเนื่องจากโดยทั่วไปแล้วจะอ้างอิง ksh88 ซึ่งไม่ได้รับฟีเจอร์ใหม่ตั้งแต่ 90s) ที่ได้รับการรับรองว่า เป็นไปตาม POSIX sh(เป็นส่วนหนึ่งของการรับรอง macOS)

เมื่อคุณเขียนสคริปต์ด้วย#! /bin/sh -she-bang คุณควรใช้shไวยากรณ์มาตรฐาน(และควรใช้ไวยากรณ์มาตรฐานสำหรับยูทิลิตี้ที่ใช้ในสคริปต์นั้นหากคุณต้องการพกพาไม่ใช่แค่เชลล์ที่เกี่ยวข้องเมื่อตีความเชลล์ สคริปต์) จากนั้นไม่สำคัญว่าการใช้งานของshล่ามไวยากรณ์มาตรฐานนั้นจะใช้ ( ksh, bash... )

ไม่สำคัญว่าเชลล์เหล่านั้นจะมีส่วนขยายเกินมาตรฐานตราบใดที่คุณไม่ได้ใช้งาน มันเหมือนกับการเขียนรหัส C ตราบใดที่คุณเขียนรหัส C มาตรฐานและไม่ใช้ส่วนขยายของคอมไพเลอร์หนึ่ง (เช่นgcc) หรืออื่น ๆ โค้ดของคุณควรคอมไพล์ตกลงโดยไม่คำนึงถึงการใช้คอมไพเลอร์ที่คอมไพเลอร์

ที่นี่กับ#! /bin/shเธอปัง, ปัญหาหลักของคุณจะเป็นระบบที่/bin/shเป็นบอร์นเชลล์ที่เช่นไม่สนับสนุนคุณลักษณะมาตรฐานเช่น$((1+1)), $(cmd), ${var#pattern}... ซึ่งในกรณีนี้คุณอาจต้องทำงาน arounds ที่ชอบ:

#! /bin/sh -
if false ^ true; then
  # in the Bourne shell, ^ is an alias for |, so false ^ true returns
  # true in the Bourne shell and the Bourne shell only.
  # Assume the system is Solaris 10 (older versions are no longer maintained)
  # You would need to adapt if you need to support some other system
  # where /bin/sh is the Bourne shell.
  # We also need to fix $PATH as the other utilities in /bin are
  # also ancient and not POSIX compatible.
  PATH=`/usr/xpg6/bin/getconf PATH`${PATH:+:}$PATH || exit
  export PATH
  exec /usr/xpg4/bin/sh "$0" "$@"
  # that should give us an environment that is mostly  compliant
  # to the Single UNIX Specification version 3 (POSIX.2004), the
  # latest supported by Solaris 10.
fi
# rest of the script

อย่างไรก็ตาม Ubuntu /bin/shไม่ได้เป็นbashค่าเริ่มต้น มันเป็นdashวันนี้เชลล์ที่อยู่บนพื้นฐานของ NetBSD shตัวเองอยู่บนพื้นฐานของ Almquist เปลือกซึ่งส่วนใหญ่ตาม POSIX ยกเว้นว่าจะไม่สนับสนุนอักขระหลายไบต์ บน Ubuntu และระบบที่ใช้เดเบียนอื่น ๆ คุณสามารถเลือกระหว่างbashและdashสำหรับ/bin/shด้วยdpkg-reconfigure dash) 4 shสคริปต์ที่มาพร้อมกับ Debian ควรทำงานเหมือนกันในทั้งสองเชลล์เนื่องจากจะถูกเขียนไปยังมาตรฐานนโยบาย Debian (superset ของมาตรฐาน POSIX) คุณอาจจะพบว่าพวกเขายังตกลงในการทำงานzshของshการจำลองหรือbosh(อาจจะไม่ksh93มิได้yashซึ่งไม่ได้มีlocalในตัว (ต้องตามนโยบาย Debian แต่ไม่ POSIX))

ระบบทั้งหมดในขอบเขตบน unix.stackexchange.com มี POSIX ที่sh ใดที่หนึ่ง ส่วนใหญ่มี/bin/sh(คุณอาจพบสิ่งที่หายากมากที่ไม่มี/binไดเรกทอรี แต่คุณอาจไม่สนใจเรื่องนั้น) และโดยทั่วไปแล้วshล่ามPOSIX (และในกรณีที่หายากเปลือก Bourne (ที่ไม่ได้มาตรฐาน) แทน )

แต่shเป็นล่ามเชลล์ตัวเดียวที่สามารถเรียกใช้งานได้คุณสามารถค้นหาบนระบบได้ สำหรับเปลือกหอยอื่น ๆ ที่คุณสามารถมั่นใจได้ MacOS, Cygwin และการแจกแจงที่สุด GNU / Linux bashจะมี ระบบปฏิบัติการที่ได้รับจาก SYSV (Solaris, AIX ... ) โดยทั่วไปจะมี ksh88 อาจเป็น ksh93 OpenBSD, MirOS จะมีอนุพันธ์ pdksh MacOS zshจะมี แต่จากนั้นจะไม่มีการรับประกัน ไม่มีการรับประกันไม่ว่าbashจะมีการติดตั้งเชลล์อื่น ๆ หรือเชลล์/binอื่น ๆ (โดยทั่วไปจะพบใน/usr/local/binBSD เมื่อติดตั้งเป็นต้น) และแน่นอนไม่มีการรับประกันเวอร์ชันของเชลล์ที่จะติดตั้ง

สังเกตว่า #! /path/to/executableไม่ได้เป็นการประชุมก็คุณสมบัติทั้งหมดของระบบปฏิบัติการยูนิกซ์เหมือนเมล็ด ( เปิดตัวในช่วงต้นยุค 80 โดยเดนนิสริตชี่ ) #!ที่ช่วยให้รันไฟล์โดยพลการโดยการระบุเส้นทางของล่ามในบรรทัดแรกที่เริ่มต้นด้วย มันสามารถปฏิบัติการได้

เมื่อคุณเรียกใช้งานไฟล์ที่บรรทัดแรกขึ้นต้นด้วย #! /some/file some-optional-argเคอร์เนลจะจบลง/some/fileด้วยการดำเนินsome-optional-argการพา ธ ของสคริปต์และอาร์กิวเมนต์ดั้งเดิมเป็นอาร์กิวเมนต์ คุณสามารถสร้างบรรทัดแรก#! /bin/echo testเพื่อดูว่าเกิดอะไรขึ้น:

$ ./myscript foo
test ./myscript foo

เมื่อคุณใช้/bin/sh -แทน/bin/echo test , รันเคอร์เนล/bin/sh - ./myscript foo, shตีความรหัสเนื้อหาที่เก็บไว้ในmyscriptและละเว้นที่บรรทัดแรกเป็นมันความคิดเห็น (เริ่มต้นด้วย#)


¹อาจเป็นระบบเดียวในวันนี้ที่พวกเราทุกคนจะเจอ /bin/shที่อยู่บนพื้นฐานของบอร์นเปลือก Solaris 10 Solaris เป็นหนึ่งในไม่กี่ Unices ที่ตัดสินใจที่จะเก็บเปลือกบอร์นมีความเข้ากันได้ย้อนหลัง (คน POSIX shภาษาไม่ได้อย่างเต็มที่ เข้ากันได้ย้อนหลังกับ Bourne shell) และ (อย่างน้อยสำหรับเดสก์ท็อปและการปรับใช้เซิร์ฟเวอร์แบบเต็ม) มี POSIX shที่อื่น (ใน/usr/xpg4/bin/sh, ขึ้นอยู่กับ ksh88) แต่เปลี่ยนไปใน Solaris 11 ซึ่ง/bin/shตอนนี้เป็น ksh93 คนอื่น ๆ ส่วนใหญ่จะตาย

² ของ MacOS / X เคยเป็นแต่ต่อมาเปลี่ยนเป็น ไม่ใช่จุดสนใจหลักที่จะใช้เป็นการนำPOSIX มาใช้ ของมัน/bin/shzshbashzshshshโหมดเป็นหลักเพื่อให้สามารถฝังหรือโทร ( source) POSIX shรหัสในzshสคริปต์

³เมื่อเร็ว ๆ นี้@schilyขยายเชลล์ OpenSolaris (ฐานบนเชลล์ SVR4 ตามเชลล์เป้าหมาย) เพื่อให้เป็นไปตาม POSIX ที่เรียกว่าboshแต่ฉันไม่ทราบว่ามันใช้กับระบบใด ๆ พร้อมกับksh88ที่ทำให้มันเป็นเปลือกที่สอดคล้องกับ POSIX ที่สองตามรหัสของเชลล์เป้าหมาย

4ในเวอร์ชั่นที่เก่ากว่าคุณสามารถใช้mkshหรือการlkshจุติPOSIX ได้มากกว่า นั่นคือเปลือก MirOS (เดิมคือ MirBSD) ที่ใช้ pdksh ซึ่งเป็นตัวของตัวเองตามเชลล์ Forsyth (การปรับใช้ใหม่อีกครั้งของ Bourne shell)


สิ่งเล็ก ๆ น้อย ๆ (ประมาณกลางคำตอบรหัสเชลล์): คุณไม่ควรใช้exec sh "$0" "$@"หลังจากตั้งค่าPATH? นั่นควรจะshมาจากที่ที่ถูกต้องฉันจะคิด
Kusalananda

1
@ Kusalananda ที่ควรจะทำงาน แต่มีความเสี่ยงมากขึ้นเพราะเราสามารถจบลงด้วยการวนซ้ำไม่รู้จบหากมีบางสิ่งผิดปกติ (เช่นดวลกับสิทธิ์ที่ไม่ถูกต้อง getconf แก้ไข ... ) อย่างไรก็ตามส่วนที่เหลือเป็นเฉพาะกับ Solaris 10 ดังนั้นเราจึงยังสามารถทุกอย่าง hardcode $PATHรวมถึงเนื้อหาของ
Stéphane Chazelas

การอ้างอิงใด ๆ สำหรับ OSX ที่ใช้ ksh เป็น POSIX เชลล์ เชลล์เริ่มต้นของมันเคยเป็น tcsh แต่ฉันจำไม่ได้ว่าทุบตีไม่ได้ใช้โดยเฉพาะอย่างยิ่งเนื่องจาก Korn Shell ไม่ได้เป็นโอเพ่นซอร์สจนกระทั่งหลังจาก OSX ออกมา
user151019

1
@ เครื่องหมายฉันไม่ได้บอกว่า OSX เคยใช้ ksh มาก่อน ฉันบอกว่ามันเคยเป็น zsh และพวกเขาก็เปลี่ยนไปใช้ทุบตี
Stéphane Chazelas

1
@fpmurphy ถ้าคุณดูที่เวอร์ชันก่อนหน้า bash ก็เข้าข้าง ksh แล้วไม่ว่า ksh จะเข้ากันไม่ได้กับ Bourne shell ในขณะที่คุณต้องรอจนกระทั่ง bash2 ถึงระดับคุณลักษณะเดียวกับ ksh88 ในตอนแรก bash จะมีส่วนขยายของ ksh หลายอย่างเช่น$(...)โหมด emacs / vi การขยายตัวของตัวหนอน / วงเล็บปีกกา , ไวยากรณ์ฟังก์ชัน ksh-style ...
Stéphane Chazelas

8

ใช่คุณสามารถใช้#!/bin/shในสคริปต์เพราะ/bin/shเป็น (หวังว่า) มีให้บริการบนระบบดังกล่าวมักจะผ่านการเชื่อมโยงของการจัดเรียงบางอย่างที่ทำให้bashประพฤติ (มากหรือน้อย) เหมือนshจะ นี่คือระบบ Centos7 ที่เชื่อมโยงshไปยังbash:

-bash-4.2$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Dec  4 16:48 /bin/sh -> bash
-bash-4.2$ 

คุณสามารถใช้#!/bin/bashหากคุณเขียนbashสคริปต์สำหรับระบบนั้นเท่านั้นและต้องการใช้bashคุณสมบัติ อย่างไรก็ตามสคริปดังกล่าวจะประสบปัญหาการพกพาเช่นบน OpenBSD ที่bashมีการติดตั้งเฉพาะในกรณีที่ผู้ดูแลระบบจะเกิดปัญหาในการติดตั้ง (ฉันทำไม่ได้) แล้วก็มีการติดตั้งไม่ได้/usr/local/bin/bash สคริปต์/bin/bashPOSIX อย่างเคร่งครัด#!/bin/shควรพกพาได้มากกว่า


หมายเหตุสิ่งนี้: "เมื่อถูกเรียกใช้เป็นshBash จะเข้าสู่โหมด POSIX หลังจากอ่านไฟล์เริ่มต้น" - gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode
glenn jackman

2
เมื่อฉันเขียนสคริปต์สำหรับเซิร์ฟเวอร์ RHEL ที่งานของฉันฉันใช้#!/bin/bashอย่างแม่นยำเพื่อให้ฉันสามารถใช้ประโยชน์จากคุณสมบัติที่ไม่ใช่ POSIX
Monty Harder

@MontyHarder IIRC บน RHEL /bin/shมันเป็น symlink ไปbashถูกต้องไหม? ฉันรู้แน่ ๆ ว่า CentOS เป็นอย่างไร
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy ใช่บนเซิร์ฟเวอร์ RHEL ฉันเพียงแค่การตรวจสอบก็ symlink bashไป ไบนารีรู้ว่าสิ่งที่เป็นชื่อที่ใช้ในการเรียกใช้มันและเมื่อมันเรียกว่าการกระทำเช่นโรงเรียนเก่าบอร์นsh sh
Monty Harder

6

คุณถาม

ถูกต้องหรือไม่ที่จะใส่ข้อคิดเห็น #! / bin / sh ในเชลล์สคริปต์ที่เขียนด้วยการแจกแจง Ubuntu?

คำตอบขึ้นอยู่กับสิ่งที่คุณเขียนในเชลล์สคริปต์

  • หากคุณใช้อย่างเคร่งครัดพกพาสคริปต์ POSIX สอดคล้องและไม่ได้ใช้คำสั่งทุบตีเฉพาะใด ๆ แล้วคุณสามารถ/bin/shใช้

  • หากคุณรู้ว่าคุณใช้สคริปต์บนเครื่องที่มี bash เท่านั้นและคุณต้องการใช้ไวยากรณ์เฉพาะของ bash คุณควรใช้/bin/bash

  • หากคุณต้องการตรวจสอบให้แน่ใจว่าสคริปต์จะทำงานกับเครื่อง Unix หลายประเภทคุณควรใช้ไวยากรณ์ที่สอดคล้องกับ POSIX เท่านั้นและ/bin/sh

  • หากคุณใช้เป็นประจำเปลือกอื่น (เช่นksh , zshหรือtcsh ) และต้องการที่จะใช้ไวยากรณ์ที่ในสคริปต์ของคุณแล้วคุณควรใช้ล่ามที่เหมาะสม (เช่น/bin/ksh93, /bin/zshหรือ/bin/tcsh)


3

The "#!" ความคิดเห็นที่ไม่เคยใช้หรือ/bin/bash /bin/shมันเป็นเพียงรายการสิ่งที่ล่ามควรจะไม่เพียง แต่สำหรับการเขียนสคริปต์เปลือก #!/usr/bin/env pythonยกตัวอย่างเช่นสคริปต์หลามของฉันมักจะเริ่มต้นด้วย

ตอนนี้ความแตกต่างระหว่าง#!/bin/shและ#!/bin/bashคือว่า/bin/shไม่เคย symlink /bin/bashไป บ่อยครั้ง แต่ไม่เสมอไป Ubuntu เป็นข้อยกเว้นที่น่าทึ่งที่นี่ ฉันได้เห็นสคริปต์ปรับการทำงานใน CentOS แต่ล้มเหลวบน Ubuntu #!/bin/shเพราะผู้เขียนใช้ไวยากรณ์ทุบตีเฉพาะกับ


1

ขออภัยที่เทน้ำเย็นลงบนคำตอบที่ยอดเยี่ยมทั้งหมดที่กล่าวว่า/bin/shมีอยู่ในระบบ Unix ทั้งหมด - มีอยู่ยกเว้นในระบบ Unix ที่ใช้มากที่สุดตลอดเวลา: Android

Android มีเชลล์อยู่/system/bin/shแล้วและโดยทั่วไปจะไม่มีวิธีในการสร้าง/bin/shลิงก์แม้แต่บนระบบที่ถูกรูท (เนื่องจากวิธีที่ระบบถูกล็อกโดยการใช้ selinux และขีดความสามารถ (7) ชุดขอบเขต)

สำหรับผู้ที่จะบอกว่า Android ไม่ใช่ POSIX-compantant: ทั้ง Linux และ BSD นั้นไม่ได้มีการกระจาย และการดำรงอยู่ของ/bin/shกับเส้นทางนี้ไม่ได้รับคำสั่งจากมาตรฐาน :

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


ในขณะที่ระบบทั้งหมดที่พยายามทำตาม POSIX มีข้อบกพร่องมากมายที่สอดคล้องกัน (รวมถึงระบบที่ได้รับการรับรอง), Android (และระบบฝังตัวอื่น ๆ เช่นเราเตอร์หรือ Lightbulb OS) ส่วนใหญ่ไม่ได้ต้องการให้เป็นไปตาม POSIX Android เป็นหัวข้อที่นี่ยกเว้นเมื่อมันมาถึงอินเตอร์เฟซ POSIX
Stéphane Chazelas

@ คริสโตเฟอร์ซึ่งgetconf? เช่นใน Solaris 11.4 นั่นจะเป็นสิ่งนั้น/usr/binหรือไม่? หนึ่งใน/usr/xpg4/bin(สำหรับการปฏิบัติตาม SUSv2), หนึ่งใน/usr/xpg6/bin(สำหรับการปฏิบัติตาม SUSv3)? /usr/xpg7/bin(สำหรับ SUSv4)?
Stéphane Chazelas

@ StéphaneChazelasถ้าเราตัดสินความตั้งใจได้ฉันคิดว่าฉันสามารถขุด Linus Torvalds หรือ Theo de Raadt โดยอ้างถึงผลที่พวกเขาไม่สนใจ POSIX ;-) และระบบฝังตัวส่วนใหญ่ใช้ Linux + busybox ซึ่งแทบไม่สอดคล้องกับ POSIX น้อยกว่าระบบ Unix-like ทั่วไป และ a) android ไม่ใช่ระบบ "ฝังตัว" และ b) ระบบ android สามารถทำตาม POSIX ได้โดยไม่ต้องใช้เชลล์ใน /bin/sh
4327

1
@mosvy สิ่งที่คุณพูดส่วนใหญ่เป็นความจริง แต่ Torvalds สามารถพูดสำหรับเคอร์เนล Linux เท่านั้น Chet Ramey ใส่ใจเกี่ยวกับการปฏิบัติตาม POSIX สำหรับการทุบตี RedHat ใส่ใจการปฏิบัติตาม POSIX (พวกเขาสนับสนุนกลุ่ม Austin และนั่งประชุมกลุ่มพวกเขาดูแลซอฟต์แวร์ GNU จำนวนมาก) แนวคิดคือ POSIX เป็นมาตรฐานเดียวที่ระบบ Unix ส่วนใหญ่ดู ผู้ใช้ใส่ใจกับ POSIX ที่สอดคล้องเนื่องจากช่วยให้การพกพาซอฟต์แวร์ไปยังระบบต่าง ๆ ง่ายขึ้น มันไม่เหมาะ แต่ดีกว่าไม่มีอะไร Android มีการเขียนโปรแกรม API ของตัวเอง POSIX ไม่ได้มีความกังวล
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.