Skip to main content

Linux - คำสั่ง Unix: exec

แนะนำ unix ตอน 3: การใช้ redirection และ pipe (มิถุนายน 2025)

แนะนำ unix ตอน 3: การใช้ redirection และ pipe (มิถุนายน 2025)
Anonim

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

สรุป

exec? สวิทช์ ? หาเรื่อง ? arg … ?

ลักษณะ

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

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

-keepnewline

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

--

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

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

|

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

|&

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

< ชื่อไฟล์

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

<@ fileID '

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

<< ราคา

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

> ชื่อไฟล์

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

2> ชื่อไฟล์

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

>& ชื่อไฟล์

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

>> ชื่อไฟล์

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

2>> ชื่อไฟล์

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

>>& ชื่อไฟล์

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

>@ fileID '

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

2>@ fileID '

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

>&@ fileID '

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

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

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

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

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

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

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

ของ windows (ทุกเวอร์ชัน)

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

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

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

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

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

Windows NT

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

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

เพื่อดำเนินการคำสั่งภายในของเชลล์เช่นdir และสำเนา, ผู้โทรต้อง prepend ``cmd.exe / c'' ไปยังคำสั่งที่ต้องการ

Windows 95

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

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

เพื่อดำเนินการคำสั่งภายในของเชลล์เช่นdir และสำเนา, ผู้โทรต้อง prepend ``command.com / c'' ไปยังคำสั่งที่ต้องการ

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

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

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

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

เสื้อฝน

exec ไม่ได้ใช้งานและไม่มีอยู่ภายใต้ Macintosh

ยูนิกซ์

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

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

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

คำสำคัญ

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

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