Exec - คำสั่ง Linux - คำสั่ง Unix

exec - เรียกกระบวนการย่อย

สรุป

exec ? สวิตช์ ? arg ? arg ... ?

ลักษณะ

คำสั่งนี้จะถือว่าอาร์กิวเมนต์เป็นข้อกำหนดของโพรเซสย่อยอย่างน้อยหนึ่งรายการที่จะรัน อาร์กิวเมนต์จะอยู่ในรูปของท่อมาตรฐานซึ่งแต่ละ อาร์กิวเมนต์ จะกลายเป็นคำสั่งหนึ่งคำสั่งและแต่ละคำสั่งจะกลายเป็นกระบวนการย่อย

ถ้าอาร์กิวเมนต์เริ่มต้นที่ exec เริ่มต้นด้วย - แล้วพวกเขาจะถือว่าเป็นสวิทช์บรรทัดคำสั่งและไม่ได้เป็นส่วนหนึ่งของข้อกำหนดของท่อ สวิตช์ต่อไปนี้ได้รับการสนับสนุนในปัจจุบัน:

-keepnewline

ยังคงเป็นบรรทัดใหม่ในผลลัพธ์ของท่อส่ง โดยปกติบรรทัดใหม่จะถูกลบออก

-

ทำเครื่องหมายจุดสิ้นสุดของสวิทช์ อาร์กิวเมนต์ต่อไปนี้จะถือว่าเป็น อาร์กิวเมนต์ แรกแม้ว่าจะเริ่มต้นด้วย -

ถ้า อาร์กิวเมนต์ (หรือคู่ของ อาร์กิวเมนต์ ) มีรูปแบบใดแบบหนึ่งที่อธิบายไว้ด้านล่างจะใช้โดย exec เพื่อควบคุมการไหลของข้อมูลขาเข้าและขาออกระหว่างกระบวนการย่อย อาร์กิวเมนต์ดังกล่าวจะไม่ถูกส่งผ่านไปยังกระบวนการย่อย ในรูปแบบเช่น `` < fileName '' fileName อาจอยู่ในอาร์กิวเมนต์แยกต่างหากจาก `` <'' หรือในอาร์กิวเมนต์เดียวกันโดยไม่มีการแทรกแซงพื้นที่ (เช่น `` < fileName '')

|

แยกคำสั่งที่แตกต่างออกไปในท่อ เอาท์พุทมาตรฐานของคำสั่งก่อนหน้านี้จะถูกใส่เข้าไปในอินพุตมาตรฐานของคำสั่งถัดไป

| &

แยกคำสั่งที่แตกต่างออกไปในท่อ ทั้งสองเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานของคำสั่งก่อนหน้านี้จะถูกใส่เข้าไปในอินพุตมาตรฐานของคำสั่งถัดไป รูปแบบการเปลี่ยนเส้นทางนี้แทนที่รูปแบบเช่น 2> และ> &

< fileName

ไฟล์ที่ชื่อว่า fileName ถูกเปิดและใช้เป็นอินพุทมาตรฐานสำหรับคำสั่งแรกในท่อ

<@ fileId

FileId ต้องเป็นตัวระบุสำหรับไฟล์ที่เปิดเช่นค่าที่ส่งคืนจากการเรียกก่อนหน้านี้เพื่อ เปิด ใช้เป็นอินพุทมาตรฐานสำหรับคำสั่งแรกในท่อ ต้องเปิด FileId เพื่ออ่าน

<< มูลค่า

ค่า จะถูกส่งผ่านไปยังคำสั่งแรกเป็นอินพุทมาตรฐาน

> fileName

เอาท์พุทมาตรฐานจากคำสั่งสุดท้ายถูกเปลี่ยนเส้นทางไปยังไฟล์ชื่อ fileName โดยเขียนทับเนื้อหาก่อนหน้านี้

2> fileName

ข้อผิดพลาดมาตรฐานจากคำสั่งทั้งหมดในท่อถูกเปลี่ยนเส้นทางไปยังไฟล์ชื่อ fileName โดยเขียนทับเนื้อหาก่อนหน้านี้

> & fileName

เอาท์พุทมาตรฐานทั้งจากคำสั่งสุดท้ายและข้อผิดพลาดมาตรฐานจากคำสั่งทั้งหมดถูกเปลี่ยนเส้นทางไปยังไฟล์ชื่อ fileName เขียนทับเนื้อหาก่อนหน้า

>> fileName

เอาท์พุทมาตรฐานจากคำสั่งสุดท้ายถูกเปลี่ยนเส้นทางไปยังไฟล์ชื่อ FileName และต่อท้ายด้วยการแทนที่

2 >> fileName

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

>> & fileName

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

> @ fileId

FileId ต้องเป็นตัวระบุสำหรับไฟล์ที่เปิดเช่นค่าที่ส่งคืนจากการเรียกก่อนหน้านี้เพื่อ เปิด เอาต์พุตมาตรฐานจากคำสั่งสุดท้ายถูกเปลี่ยนเส้นทางไปยัง ไฟล์ fileId ซึ่งต้องเปิดใช้งานสำหรับเขียน

2> @ fileId

FileId ต้องเป็นตัวระบุสำหรับไฟล์ที่เปิดเช่นค่าที่ส่งคืนจากการเรียกก่อนหน้านี้เพื่อ เปิด ข้อผิดพลาดมาตรฐานจากคำสั่งทั้งหมดในท่อถูกเปลี่ยนเส้นทางไปยัง ไฟล์ fileId ต้องเปิดไฟล์เพื่อเขียน

> & @ fileId

FileId ต้องเป็นตัวระบุสำหรับไฟล์ที่เปิดเช่นค่าที่ส่งคืนจากการเรียกก่อนหน้านี้เพื่อ เปิด เอาต์พุตมาตรฐานทั้งจากคำสั่งสุดท้ายและข้อผิดพลาดมาตรฐานจากคำสั่งทั้งหมดถูกเปลี่ยนเส้นทางไปยัง ไฟล์ fileId ต้องเปิดไฟล์เพื่อเขียน

ถ้าเอาต์พุตมาตรฐานไม่ได้รับการเปลี่ยนเส้นทางคำสั่ง exec จะส่งคืนผลลัพธ์มาตรฐานจากคำสั่งสุดท้ายในระบบท่อ ถ้ามีคำสั่งใด ๆ ในท่อส่งออกอย่างผิดปกติหรือถูกฆ่าตายหรือถูกระงับแล้ว exec จะส่งข้อผิดพลาดและข้อความแสดงข้อผิดพลาดจะรวมเอาต์พุตของท่อไปตามข้อความแสดงข้อผิดพลาดที่อธิบายถึงจุดสิ้นสุดที่ผิดปกติ ตัวแปร errorCode จะมีข้อมูลเพิ่มเติมเกี่ยวกับการสิ้นสุดการผิดปกติล่าสุดที่พบ ถ้าคำสั่งใดเขียนลงในไฟล์ข้อผิดพลาดมาตรฐานและข้อผิดพลาดมาตรฐานนั้นไม่ถูกเปลี่ยนเส้นทาง exec จะส่งคืนข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะมีเอาต์พุตมาตรฐานของท่อตามด้วยข้อความเกี่ยวกับการสิ้นสุดที่ผิดปกติ (ถ้ามี) ตามด้วยผลลัพธ์ข้อผิดพลาดมาตรฐาน

ถ้าอักขระตัวสุดท้ายของผลลัพธ์หรือข้อความแสดงข้อผิดพลาดคืออักขระใหม่จะมีการลบอักขระดังกล่าวออกจากข้อความแสดงผลหรือข้อความแสดงข้อผิดพลาด ค่านี้สอดคล้องกับค่าตอบแทนอื่น ๆ ของ Tcl ซึ่งโดยปกติแล้วจะไม่ขึ้นกับบรรทัดใหม่ อย่างไรก็ตามถ้ามีระบุ -keepnewline ไว้บรรทัดใหม่จะถูกเก็บไว้

ถ้าอินพุตมาตรฐานไม่ถูกเปลี่ยนเส้นทางด้วย `` <'' หรือ `` << '' หรือ `` <@ '' แล้วอินพุตมาตรฐานของคำสั่งแรกในท่อจะถูกนำมาจากอินพุทมาตรฐานปัจจุบันของโปรแกรมประยุกต์

ถ้า อาร์กิวเมนต์ สุดท้ายเป็น `` และ '' ท่อจะถูกเรียกใช้ในพื้นหลัง ในกรณีนี้คำสั่ง exec จะส่งคืนรายการที่มีองค์ประกอบเป็นตัวระบุกระบวนการสำหรับโพรเซสเซอรย่อยทั้งหมดในระบบท่อ เอาท์พุทมาตรฐานจากคำสั่งสุดท้ายในท่อจะไปที่เอาท์พุทมาตรฐานของแอ็พพลิเคชันหากยังไม่ได้รับการเปลี่ยนเส้นทางและข้อผิดพลาดที่ส่งออกจากคำสั่งทั้งหมดในท่อจะไปที่ไฟล์ข้อผิดพลาดมาตรฐานของแอปพลิเคชันยกเว้นที่ถูกเปลี่ยนเส้นทาง

คำแรกในแต่ละคำสั่งจะถูกใช้เป็นชื่อคำสั่ง; จะมีการแทนที่ทิลเดอร์บนข้อมูลนี้และหากผลลัพธ์ไม่มี slashes ไดเรกทอรีในตัวแปร PATH environment จะถูกค้นหาด้วยชื่อที่กำหนด ถ้าชื่อมีเครื่องหมายทับก็ต้องอ้างอิงถึงไฟล์ปฏิบัติการที่สามารถเข้าถึงได้จากไดเร็กทอรีปัจจุบัน ไม่มีการขยายตัวของ `` glob '' หรือการแทนที่แบบอื่น ๆ ของเชลล์ในอาร์กิวเมนต์ไปยังคำสั่ง

ปัญหาเกี่ยวกับการพกพา

Windows (ทุกเวอร์ชัน)

การอ่านหรือเขียนลงในซ็อกเก็ตโดยใช้สัญกรณ์ `` fileId '' ไม่ทำงาน เมื่ออ่านจากซ็อกเก็ตแอ็พพลิเคชัน DOS แบบ 16 บิตจะถูกแฮงและแอ็พพลิเคชัน 32 บิตจะกลับทันทีโดยใช้ไฟล์ท้ายสุดของไฟล์ เมื่อเขียนโปรแกรมประเภทใดประเภทหนึ่งไปยังซ็อกเก็ตข้อมูลจะถูกส่งไปยังคอนโซลแทนถ้ามีอยู่หรือถูกละทิ้ง

วิดเจ็ตข้อความคอนโซล Tk ไม่ได้มีคุณสมบัติ IO มาตรฐานจริง ภายใต้ Tk เมื่อเปลี่ยนเส้นทางจากอินพุตมาตรฐานแอ็พพลิเคชันทั้งหมดจะเห็นไฟล์ท้ายสุดของไฟล์ ข้อมูลที่ถูกเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานหรือข้อผิดพลาดมาตรฐานจะถูกยกเลิก

ทั้งสองไปข้างหน้าหรือย้อนกลับ slashes ได้รับการยอมรับเป็นตัวคั่นเส้นทางสำหรับอาร์กิวเมนต์ไปยังคำสั่ง Tcl เมื่อดำเนินการแอ็พพลิเคชันชื่อพา ธ ที่ระบุสำหรับแอ็พพลิเคชันอาจมีสแลชไปข้างหน้าหรือย้อนกลับเป็นตัวคั่นเส้นทาง อย่างไรก็ตามโปรดจำไว้ว่าแอพพลิเคชัน Windows ส่วนใหญ่ยอมรับอาร์กิวเมนต์ด้วยเครื่องหมายทับที่เป็นตัวคั่นและเครื่องหมายแบ็กสแลชเฉพาะในเส้นทางเท่านั้น อาร์กิวเมนต์ใด ๆ ที่แอ็พพลิเคชันที่ระบุชื่อพา ธ ที่มีเครื่องหมายสแลชไปข้างหน้าจะไม่ได้รับการแปลงโดยอัตโนมัติเพื่อใช้อักขระเครื่องหมายทับขวา ถ้าอาร์กิวเมนต์มี slashes ไปข้างหน้าเป็นตัวคั่นเส้นทางมันอาจจะหรืออาจไม่ได้รับการยอมรับเป็นชื่อพา ธ ขึ้นอยู่กับโปรแกรม

นอกจากนี้เมื่อเรียกใช้แอพพลิเคชัน DOS หรือWindows®แบบ 16 บิตชื่อเส้นทางทั้งหมดจะต้องใช้รูปแบบเส้นทางที่สั้นและคลุมเครือ (เช่นใช้ `` applba ~ 1.def '' แทน `` applbakery.default '' )

มีทับไปข้างหน้าหรือย้อนกลับสองแถวขึ้นไปในแถวหนึ่ง ๆ ในเส้นทางหมายถึงเส้นทางเครือข่าย ตัวอย่างเช่นการเชื่อมต่อแบบธรรมดาของไดเรกทอรีราก c: / โดยใช้ไดเร็กทอรีย่อย / windows / system จะแสดงผล c: // windows / system (สอง slashes ร่วมกัน) ซึ่งหมายถึงจุดเชื่อมต่อที่เรียกว่า ระบบ บนเครื่องที่เรียกว่า windows (และ c: / จะถูกละเว้น) และไม่เท่ากับ c: / windows / system ซึ่งจะอธิบายไดเร็กทอรีบนคอมพิวเตอร์ในปัจจุบัน ควรใช้คำสั่ง join file เพื่อรวมส่วนประกอบของพา ธ

Windows NT

เมื่อพยายามรันแอพพลิเคชัน exec จะ ค้นหาชื่อตามที่ระบุไว้ จากนั้นในลำดับชื่อ .com , .exe และ . bat จะถูกเพิ่มท้ายท้ายชื่อที่ระบุและจะค้นหาชื่ออีกต่อไป หากชื่อไดเร็กทอรีไม่ได้ระบุเป็นส่วนหนึ่งของชื่อแอ็พพลิเคชันไดเรกทอรีต่อไปนี้จะค้นหาตามลำดับโดยอัตโนมัติเมื่อพยายามหาแอ็พพลิเคชัน:

ไดเร็กทอรีที่โหลด Tcl executable
ไดเรกทอรีปัจจุบัน
ไดเรกทอรีระบบ 32 บิตของ Windows NT
ไดเร็กทอรีระบบ Windows NT 16 บิต
ไดเร็กทอรีโฮมของ Windows NT
ไดเรกทอรีที่อยู่ในเส้นทาง

เพื่อที่จะรันคำสั่ง builtin shell เช่น dir และ copy ผู้เรียกจะต้องใส่คำสั่ง `` cmd.exe / c 'ไว้ในคำสั่งที่ต้องการ

Windows 95

เมื่อพยายามรันแอพพลิเคชัน exec จะ ค้นหาชื่อตามที่ระบุไว้ จากนั้นในลำดับชื่อ .com , .exe และ . bat จะถูกเพิ่มท้ายท้ายชื่อที่ระบุและจะค้นหาชื่ออีกต่อไป หากชื่อไดเร็กทอรีไม่ได้ระบุเป็นส่วนหนึ่งของชื่อแอ็พพลิเคชันไดเรกทอรีต่อไปนี้จะค้นหาตามลำดับโดยอัตโนมัติเมื่อพยายามหาแอ็พพลิเคชัน:

ไดเร็กทอรีที่โหลด Tcl executable
ไดเรกทอรีปัจจุบัน
ไดเร็กทอรีระบบ Windows 95
ไดเร็กทอรีโฮมของ Windows 95
ไดเรกทอรีที่อยู่ในเส้นทาง

เพื่อที่จะรันคำสั่ง builtin shell เช่น dir และ copy ผู้เรียกจะต้องใส่ คำสั่ง `` command.com / c 'ลงในคำสั่งที่ต้องการ

เมื่อโปรแกรม DOS แบบ 16 บิตได้อ่านอินพุตมาตรฐานจากคอนโซลแล้วออกจากโปรแกรมใช้งาน DOS แบบ 16 บิตต่อมาจะเห็นการป้อนข้อมูลมาตรฐานตามที่ปิดอยู่ โปรแกรมประยุกต์แบบ 32 บิตไม่มีปัญหานี้และจะทำงานได้อย่างถูกต้องแม้ว่าโปรแกรมประยุกต์ DOS แบบ 16 บิตจะคิดว่าอินพุตมาตรฐานถูกปิด ขณะนี้ยังไม่มีการแก้ปัญหาที่เป็นที่รู้จักของบั๊กนี้

การเปลี่ยนเส้นทางระหว่าง NUL: device และแอ็พพลิเคชัน 16 บิตไม่ทำงาน เมื่อเปลี่ยนเส้นทางจาก NUL: แอปพลิเคชันบางอย่างอาจแขวนอื่น ๆ จะมีสตรีม "ไบต์ 0x01" เป็นจำนวนอนันต์และบางไฟล์จะได้รับไฟล์ท้ายสุดโดยทันที พฤติกรรมดูเหมือนว่าจะขึ้นอยู่กับบางอย่างที่รวบรวมไว้ในแอพพลิเคชันเอง เมื่อเปลี่ยนเส้นทางมากกว่า NUL 4K หรือมากกว่านั้น : แอปพลิเคชันบางอย่างจะแขวนไว้ ปัญหาดังกล่าวไม่ได้เกิดขึ้นกับแอ็พพลิเคชัน 32 บิต

แอพพลิเคชัน DOS 16 บิตทั้งหมดจะรัน synchronously อินพุตมาตรฐานทั้งหมดจากท่อไปยังแอ็พพลิเคชัน DOS แบบ 16 บิตจะถูกรวบรวมลงในไฟล์ชั่วคราว ปลายอีกด้านหนึ่งของท่อต้องถูกปิดก่อนที่โปรแกรมประยุกต์ DOS แบบ 16 บิตจะเริ่มทำงาน เอาต์พุตหรือข้อผิดพลาดมาตรฐานทั้งหมดจากแอ็พพลิเคชัน DOS แบบ 16 บิตไปยังท่อจะถูกรวบรวมเป็นไฟล์ชั่วคราว แอ็พพลิเคชันต้องยุติก่อนที่ไฟล์ชั่วคราวจะถูกเปลี่ยนเส้นทางไปยังขั้นตอนต่อไปของท่อ นี่เป็นเพราะการแก้ปัญหาข้อบกพร่องของ Windows 95 ในการติดตั้งท่อและวิธีการที่ Windows 95 DOS shell แบบมาตรฐานจะจัดการกับท่อได้

แอ็พพลิเคชันบางอย่างเช่น command.com ไม่ควรทำงานโต้ตอบ แอ็พพลิเคชันที่เข้าสู่หน้าต่างคอนโซลโดยตรงแทนที่จะอ่านจากอินพุตมาตรฐานและเขียนไปยังเอาต์พุตมาตรฐานอาจล้มเหลวแขวน Tcl หรือแม้กระทั่งแขวนระบบหากไม่มีหน้าต่างคอนโซลส่วนตัวของตัวเอง

เสื้อฝน

คำสั่ง exec ไม่ได้ถูกใช้งานและไม่มีอยู่ใน Macintosh

ยูนิกซ์

คำสั่ง exec ทำงานได้อย่างสมบูรณ์ตามที่อธิบายไว้

ดูสิ่งนี้ด้วย

ข้อผิดพลาด (n), เปิด (n)

คำสำคัญ

รัน, ท่อ, การเปลี่ยนเส้นทาง, กระบวนการย่อย

สำคัญ: ใช้คำสั่ง man ( % man ) เพื่อดูว่าคำสั่งถูกใช้อย่างไรในคอมพิวเตอร์เครื่องใดเครื่องหนึ่งของคุณ