"การเรียกว่า" หมายถึงสิ่งที่เป็นที่ขั้นตอนการเริ่มต้นทำให้ทุบตีใน "ข้อที่ศูนย์" argv[0]อาร์กิวเมนต์บรรทัดคำสั่งของตน
เมื่อโปรแกรมเริ่มต้นด้วยexec*()syscallsพวกเขาจะไม่รู้จักชื่อของไฟล์ไบนารีที่มีโปรแกรม แต่กระบวนการเรียกมีอิสระที่จะใส่สิ่งที่ต้องการ ปกติแล้วชื่อจะถูกนำมาจากระบบไฟล์ดังนั้นหากคุณเรียกใช้/bin/shนั่นคือสิ่งที่จะนำไปสู่ที่นั่น และถ้า/bin/shเป็น Bash ก็ไม่จำเป็นต้องเป็น symlink ก็อาจเป็นฮาร์ดลิงก์หรือสำเนาของโปรแกรมเชลล์อีกชุด
เป็นตัวอย่างของการตั้งค่า "ชื่อโปรแกรม" execคำสั่งของ Bash สามารถตั้งค่าอาร์กิวเมนต์ zeroth ด้วย-aตัวเลือก (เราสามารถทำเช่นเดียวกันกับ Perl หรือโดยตรงกับ C เป็นต้น)
นี่mynameคือโปรแกรม C อย่างง่ายที่เพิ่งพิมพ์อาร์กิวเมนต์ zeroth ชื่อที่มันเห็นตัวเอง:
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
ที่มา:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
แต่เพื่อตอบคำถามที่มีหมายเลข ...
(ที่ 1 และ 4) การทำงานsh somescriptจะทำงานอะไรก็ตามที่shอยู่ในของคุณPATHอาจจะเป็น/bin/shแต่อาจจะเป็นสิ่งที่ชอบ/usr/xpg4/bin/sh
- ถ้ามันทุบตีมันทำงานในโหมด POSIX
shเพราะมันเห็นชื่อ
- ถ้าเป็น Z เชลล์หรือ Korn เชลล์มันก็จะเห็นชื่อ
shแต่มันจะทำงานในโหมด "SH Compatible" ซึ่งมีวัตถุประสงค์เพื่อให้เข้ากันได้กับ Bourne เชลล์และแตกต่างอย่างสิ้นเชิงกับโหมด POSIX แบบเต็มในเปลือกทั้งสองอย่างนั้น .
- มันอาจเป็น Almquist shell, Bourne shell ที่แท้จริงหรืออย่างอื่นแน่นอน
(2 & 5) การรันbash somescriptจะทำงานในโหมด Bash ปกติ (อีกครั้งแน่นอนว่ามันขึ้นอยู่กับว่าbashคุณPATHอยู่ในโหมดใด)
(3) ที่นี่ชื่อของสคริปต์จะถูกกำหนดโดยตรงกับการเรียกของระบบแทนไฟล์โปรแกรม เคอร์เนลอ่านบรรทัด hashbang และใช้เพื่อรันสคริปต์
(6) อันนี้ซับซ้อน คล้ายกับ (3) แต่การเรียกระบบสำหรับการเริ่มโปรแกรมล้มเหลว ( ENOEXEC (Exec format error)) เนื่องจากไม่มีบรรทัด hashbang สิ่งที่เกิดขึ้นต่อไปขึ้นอยู่กับว่าเชลล์ที่คุณใช้อยู่นั้นอยู่ในโหมด POSIX หรือไม่ POSIX ต้องการให้ POSIX ENOEXECสอดคล้องประพฤติเปลือกในแฟชั่นที่เฉพาะเจาะจงในการตอบสนอง อย่างไรก็ตามมีบางระยะใน "คำสั่งเทียบเท่ากับการเรียกเปลือก" ซึ่งหมายความว่าเปลือกที่แตกต่างกันทำสิ่งที่แตกต่างกัน
- เชลล์ Bourne Again อีกครั้งรันตัวเองในโหมดเดียวกันโดยมีชื่อของสคริปต์เป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก ในโหมดที่สอดคล้องกับ POSIX มันเป็นของหลักสูตรที่ทำงานตัวเองในโหมดที่สอดคล้องกับ POSIX ของมันจึงเชื่อฟังข้อกำหนดของ POSIX เพื่อเรียกใช้เปลือกที่สอดคล้อง POSIX
- Z เชลล์, Almquist เชลล์และ Korn เชลล์รัน
/bin/shด้วยชื่อของสคริปต์ที่แทรกไว้ก่อนหน้าอาร์กิวเมนต์อื่น ๆ เป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก Z เชลล์, Almquist เชลล์และ Korn เชลล์คือ (พยายาม) เพื่อเรียกใช้เชลล์ที่สอดคล้องกับ POSIX โดยอาศัยการสมมติว่า/bin/shโปรแกรมนั้นเป็นหนึ่ง