"การเรียกว่า" หมายถึงสิ่งที่เป็นที่ขั้นตอนการเริ่มต้นทำให้ทุบตีใน "ข้อที่ศูนย์" 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
โปรแกรมนั้นเป็นหนึ่ง