ชื่อ
sh - คำสั่งล่าม (เปลือก)
สรุป
ดวลจุดโทษ -/ + aCefnuvxIimqsVEbc -โอ longname -words เป้าหมาย …
รายละเอียด
Sh เป็นล่ามคำสั่งมาตรฐานสำหรับระบบ รุ่นปัจจุบันของดวลจุดโทษ อยู่ในระหว่างการเปลี่ยนแปลงเพื่อให้สอดคล้องกับPOSIX 1003.2 และ 1003.2a ข้อกำหนดสำหรับเปลือก รุ่นนี้มีคุณลักษณะหลายอย่างที่ทำให้ดูเหมือนกันในบางแง่มุมของเปลือก Korn แต่ก็ไม่ใช่โคลนเปลือกของ Korn (ดูที่ ksh (1)) เฉพาะคุณสมบัติที่กำหนดโดยPOSIX บวกส่วนขยาย Berkeley เพียงไม่กี่ก็ได้ถูกนำมารวมไว้ในเปลือกนี้ เราคาดว่าPOSIX ตามเวลา 4.4 BSD ออก หน้าคนนี้ไม่ได้ตั้งใจที่จะสอนหรือข้อกำหนดที่สมบูรณ์ของเปลือก
ภาพรวม
เชลล์เป็นคำสั่งที่อ่านบรรทัดจากไฟล์หรือเทอร์มินัลแปลความหมายเหล่านี้และโดยทั่วไปจะใช้คำสั่งอื่น ๆ เป็นโปรแกรมที่รันเมื่อผู้ใช้เข้าสู่ระบบ (แม้ว่าผู้ใช้สามารถเลือกเชลล์ที่แตกต่างกันได้โดยใช้คำสั่ง chsh (1)) เปลือกใช้ภาษาที่มีโครงสร้างการควบคุมการไหลของข้อมูลสิ่งอำนวยความสะดวกของมาโครที่มีคุณสมบัติหลากหลายนอกเหนือจากการจัดเก็บข้อมูลพร้อมด้วยประวัติและความสามารถในการแก้ไขบรรทัด ประกอบด้วยคุณลักษณะมากมายที่จะช่วยให้การใช้งานแบบโต้ตอบและมีข้อได้เปรียบที่ภาษาตีความเป็นเรื่องธรรมดาสำหรับการใช้งานแบบโต้ตอบและแบบไม่โต้ตอบ (เชลล์สคริปต์) นั่นคือคำสั่งสามารถพิมพ์โดยตรงไปยังเปลือกที่ทำงานหรือสามารถใส่ลงในไฟล์และไฟล์สามารถดำเนินการได้โดยตรงโดยเปลือก
การภาวนา
ถ้าอาร์กิวเมนต์ไม่มีอยู่และถ้าอินพุตมาตรฐานของเชลล์เชื่อมต่อกับเทอร์มินัล (หรือถ้า -ผมตั้งค่าสถานะ) และ -ค ตัวเลือกไม่ได้มีอยู่เปลือกถือว่าเป็นเปลือกแบบโต้ตอบ ปลั๊กอินแบบโต้ตอบจะแจ้งให้ทราบล่วงหน้าก่อนคำสั่งแต่ละคำสั่งและจัดการกับข้อผิดพลาดในการเขียนโปรแกรมและคำสั่งต่างกัน (ตามที่อธิบายไว้ด้านล่าง) เมื่อเริ่มต้นครั้งแรกเปลือกตรวจสอบอาร์กิวเมนต์ 0 และถ้ามันเริ่มต้นด้วยการรีบ `- 'เปลือกยังถือว่าเป็นเปลือกเข้าสู่ระบบ โดยปกติระบบจะทำโดยอัตโนมัติเมื่อผู้ใช้ล็อกอินเข้าสู่ระบบเปลือกแรกจะอ่านคำสั่งจากแฟ้ม / etc / profile และ .profile ถ้ามีอยู่ ถ้าตัวแปรสภาพแวดล้อมENV ถูกตั้งค่าไว้ในรายการเข้าสู่เชลล์หรือถูกตั้งค่าไว้ใน. profile ของ shell เข้าสู่ระบบ shell จะอ่านคำสั่งจากไฟล์ที่มีชื่อว่าENVดังนั้นผู้ใช้ควรวางคำสั่งที่จะดำเนินการเฉพาะเวลาล็อกอินในแฟ้ม. profile และคำสั่งที่จะดำเนินการสำหรับเปลือกภายในทั้งหมดENV ไฟล์. การตั้งค่าENV ตัวแปรไปยังไฟล์บางไฟล์ให้วางบรรทัดต่อไปนี้ไว้ในโปรไฟล์ .profile ของไดเรกทอรีบ้านของคุณ
ENV = $ HOME / .shinit; ส่งออก ENV
แทน '`.shinit' 'ชื่อไฟล์ที่คุณต้องการ ตั้งแต่ENV ไฟล์ถูกอ่านสำหรับการอุทธรณ์ทุกครั้งของเชลล์รวมถึงสคริปต์เชลล์และเปลือกที่ไม่โต้ตอบกันกระบวนทัศน์ต่อไปนี้จะเป็นประโยชน์สำหรับการ จำกัด คำสั่งในENV ไฟล์โต้ตอบ invocations วางคำสั่งภายใน `` case '' และ `` esac '' ด้านล่าง (คำสั่งเหล่านี้จะอธิบายในภายหลัง):
กรณี $ - in * i *)
# คำสั่งสำหรับการใช้งานเชิงโต้ตอบเท่านั้น
…
esac
ถ้าอาร์กิวเมนต์บรรทัดคำสั่งนอกเหนือจากตัวเลือกได้รับการระบุแล้วเชลล์จะถือว่าอาร์กิวเมนต์แรกเป็นชื่อของไฟล์ที่จะอ่านคำสั่ง (เชลล์สคริปต์) และอาร์กิวเมนต์ที่เหลือจะถูกตั้งค่าเป็นพารามิเตอร์ตำแหน่งของเชลล์ ($ 1 , $ 2 เป็นต้น) มิฉะนั้น shell จะอ่านคำสั่งจากอินพุตมาตรฐาน
การประมวลผลรายการอาร์กิวเมนต์
ตัวอักษรทั้งหมดของตัวอักษรเดียวมีชื่อที่ตรงกันซึ่งสามารถใช้เป็นอาร์กิวเมนต์ได้ -โอ ตัวเลือก ชุด -โอ ชื่อที่อยู่ถัดจากตัวอักษรตัวเดียวในคำอธิบายด้านล่าง การระบุเส้นประ - "" จะเปลี่ยนตัวเลือกในขณะที่ใช้เครื่องหมายบวก "+" จะปิดใช้ตัวเลือก คุณสามารถตั้งค่าตัวเลือกต่อไปนี้จากบรรทัดคำสั่งหรือด้วย builtin (1) (อธิบายในภายหลัง)
-a allexport
ส่งออกตัวแปรทั้งหมดที่กำหนดให้ (UNIMPLEMENTED for 4.4alpha)
-c
อ่านคำสั่งจากบรรทัดคำสั่ง จะไม่มีการอ่านคำสั่งจากอินพุตมาตรฐาน
-C noclobber
อย่าเขียนทับไฟล์ที่มีอยู่ด้วย ``> '' (UNIMPLEMENTED for 4.4alpha)
-e errexit
หากไม่โต้ตอบให้ออกทันทีหากยังไม่ได้รับคำสั่งใด ๆ สถานะทางออกของคำสั่งจะถือว่าเป็นการทดสอบอย่างชัดเจนถ้าคำสั่งถูกใช้เพื่อควบคุมถ้า elifwhile หรือจนกระทั่ง หรือถ้าคำสั่งเป็นโอเปอเรเตอร์ด้านซ้ายของตัวดำเนินการ `` และ '' หรือ `` || ''
-f noglob
ปิดการใช้งานการขยายเส้นทาง
-n noexec
ถ้าไม่โต้ตอบอ่านคำสั่ง แต่ไม่ได้ดำเนินการพวกเขา ซึ่งจะเป็นประโยชน์สำหรับการตรวจสอบไวยากรณ์ของเชลล์สคริปต์
-ยู nounset
เขียนข้อความถึงข้อผิดพลาดมาตรฐานเมื่อพยายามขยายตัวแปรที่ไม่ได้ตั้งค่าไว้และถ้าเปลือกไม่โต้ตอบให้ออกทันที (UNIMPLEMENTED for 4.4alpha)
-v อย่างละเอียด
เปลือกเขียนอินพุทของข้อผิดพลาดมาตรฐานตามที่อ่าน มีประโยชน์สำหรับการดีบัก
-x xtrace
เขียนคำสั่งแต่ละคำสั่งเป็นข้อผิดพลาดมาตรฐาน (นำหน้าด้วยเครื่องหมาย `+ 'ก่อนที่จะดำเนินการ) มีประโยชน์สำหรับการดีบัก
-q quietprofile
ถ้า -โวลต์ หรือ -x ได้รับการตั้งค่าไม่ใช้พวกเขาเมื่ออ่านไฟล์เริ่มต้นเหล่านี้ถูก / etc / profile .profile และไฟล์ที่ระบุโดยENV ตัวแปรสภาพแวดล้อม
-ผม ignoreeof
ไม่สนใจ EOF จากข้อมูลเมื่อมีการโต้ตอบ
-ผม โต้ตอบ
บังคับให้เปลือกทำงานโต้ตอบ
-m หน้าจอ
เปิดการควบคุมงาน (ตั้งโดยอัตโนมัติเมื่อโต้ตอบ)
-s stdin
อ่านคำสั่งจากอินพุตมาตรฐาน (ตั้งค่าโดยอัตโนมัติถ้าไม่มีอาร์กิวเมนต์ไฟล์อยู่) ตัวเลือกนี้ไม่มีผลเมื่อตั้งค่าหลังจากที่เชลล์เริ่มทำงานแล้ว (นั่นคือชุด (1))
-V vi
เปิดใช้งานตัวแก้ไขบรรทัดคำสั่ง vi (1) ในตัว (ปิดใช้งาน -E ถ้าได้รับการตั้งค่า)
-E emacs
เปิดใช้งานตัวแก้ไขบรรทัดคำสั่ง emacs (1) ในตัว (ปิดใช้งาน -V ถ้าได้รับการตั้งค่า)
-b แจ้ง
เปิดใช้การแจ้งเตือนแบบอะซิงโครนัสสำหรับการทำงานในพื้นหลัง (UNIMPLEMENTED for 4.4alpha)
โครงสร้างคำศัพท์
เปลือกอ่านข้อมูลในแง่ของเส้นจากไฟล์และแบ่งออกเป็นคำที่ช่องว่าง (ช่องว่างและแท็บ) และที่ลำดับบางอย่างของตัวอักษรที่มีลักษณะพิเศษของเปลือกเรียกว่า "ผู้ประกอบการ" "มีสองประเภทของผู้ประกอบการ: (ความหมายของพวกเขาจะกล่าวถึงในภายหลัง) ต่อไปนี้เป็นรายการของผู้ประกอบการ:
"ผู้ควบคุม:"
& && ( ) ; ;; | || "ผู้ดำเนินการเปลี่ยนเส้นทาง:" < > >| << >> <& >& <<- <>
Quoting ใช้เพื่อลบความหมายพิเศษของอักขระหรือคำบางคำในเชลล์เช่นตัวดำเนินการช่องว่างหรือคำหลัก การอ้างถึงสามประเภทคือการจับคู่ราคาเดียวการจับคู่ราคาคู่และเครื่องหมายทับขวา เครื่องหมายทับขวาจะสงวนความหมายที่แท้จริงของตัวอักษรต่อไปนี้ยกเว้นบรรทัดใหม่ Aq เครื่องหมายทับขวาก่อนบรรทัดใหม่ Aq จะถือว่าเป็นส่วนต่อเนื่องของบรรทัด การใส่อักขระในเครื่องหมายคำพูดแบบเดี่ยวช่วยรักษาความหมายที่แท้จริงของอักขระทั้งหมด (ยกเว้นคำพูดแบบเดี่ยวทำให้ไม่สามารถใส่เครื่องหมายคำพูดเดียวในสตริงที่ยกมาได้) อักขระที่ปิดล้อมภายในเครื่องหมายคำพูดคู่จะสงวนความหมายที่แท้จริงของอักขระทั้งหมดยกเว้นเครื่องหมายหลังดอลลาร์ ($) () และเครื่องหมายทับขวา () เครื่องหมายทับขวาภายในเครื่องหมายคำพูดแบบคู่เป็นเรื่องแปลก ๆ ในอดีตและใช้แทนอักขระต่อไปนี้เท่านั้น: $ ` มิฉะนั้นก็ยังคงเป็นตัวอักษร คำที่สงวนไว้คือคำที่มีความหมายพิเศษสำหรับเชลล์และเป็นที่ยอมรับในตอนต้นของบรรทัดและหลังตัวดำเนินการควบคุม ต่อไปนี้เป็นคำสงวน: ! ขอบคุณelif Ta fi Ta ในขณะที่กรณี Ta อื่น ๆ ตาสำหรับตาแล้วตา {Ta} ทำ Taทำ Ta จน Ta ถ้า Ta esac ความหมายของพวกเขาจะกล่าวถึงในภายหลัง นามแฝงเป็นชื่อและค่าที่สอดคล้องกันโดยใช้คำสั่งนามแฝง (1) เมื่อใดก็ตามที่คำสงวนอาจเกิดขึ้น (ดูด้านบน) และหลังจากตรวจสอบคำสงวนแล้วเชลล์จะตรวจสอบคำเพื่อดูว่าตรงกับนามแฝงหรือไม่ ถ้าไม่มีก็จะแทนที่ในกระแสอินพุตด้วยค่าของมัน ตัวอย่างเช่นถ้ามีนามแฝงที่เรียกว่า `` lf '' มีค่า `` ls -F '' แล้วใส่ข้อมูล: lf foobar จะกลายเป็น ls -F foobar นามแฝงเป็นวิธีที่สะดวกสำหรับผู้ใช้ที่ไร้เดียงสาที่จะสร้างคำสั่งชวเลขสำหรับคำสั่งโดยไม่ต้องเรียนรู้วิธีสร้างฟังก์ชันด้วยอาร์กิวเมนต์ นอกจากนี้ยังสามารถใช้เพื่อสร้างรหัสคลุมเครือ lexically การใช้นี้ไม่ได้รับการสนับสนุน เปลือกอธิบายคำที่อ่านตามภาษาข้อกำหนดที่อยู่นอกขอบเขตของหน้าคนนี้ (ดูที่ BNF ในPOSIX เอกสาร 1003.2) แม้ว่าบรรทัดแรกจะถูกอ่านและถ้าคำแรกของบรรทัด (หรือหลังโอเปอเรเตอร์ตัวควบคุม) ไม่ใช่คำสงวนแล้ว shell ก็รู้จักคำสั่งง่ายๆ มิฉะนั้นอาจได้รับการยอมรับคำสั่งที่ซับซ้อนหรือสิ่งก่อสร้างพิเศษอื่น ๆ หากมีการรู้จักคำสั่งง่ายๆเปลือกจะดำเนินการต่อไปนี้: คำนำหน้าของรูปแบบ `` name = value '' ถูกตัดออกและกำหนดให้กับสภาพแวดล้อมของคำสั่งง่ายๆ ผู้ให้บริการการเปลี่ยนเส้นทางและอาร์กิวเมนต์ของตน (ตามที่อธิบายไว้ด้านล่าง) จะถูกตัดออกและบันทึกไว้สำหรับการประมวลผล คำที่เหลือจะขยายตามที่อธิบายไว้ในส่วนที่เรียกว่า `` Expansions '' และคำแรกที่เหลือจะถือว่าเป็นชื่อคำสั่งและคำสั่งจะอยู่ คำที่เหลือจะถือว่าเป็นอาร์กิวเมนต์ของคำสั่ง ถ้าไม่มีชื่อคำสั่งเกิดขึ้น `` name = value '' การกำหนดตัวแปรที่ได้รับการยอมรับในข้อ 1 ส่งผลต่อเชลล์ปัจจุบัน การเปลี่ยนเส้นทางจะดำเนินการตามที่อธิบายไว้ในส่วนถัดไป การเปลี่ยนเส้นทาง การเปลี่ยนเส้นทางจะใช้เพื่อเปลี่ยนตำแหน่งที่คำสั่งอ่านข้อมูลเข้าหรือส่งออก โดยทั่วไปการเปลี่ยนเส้นทางเปิดปิดหรือทำซ้ำการอ้างอิงที่มีอยู่ไปยังไฟล์ รูปแบบโดยรวมที่ใช้สำหรับการเปลี่ยนเส้นทางคือ: n ไฟล์ redir-op ที่ไหน redir-op เป็นหนึ่งในผู้ดำเนินการเปลี่ยนเส้นทางที่กล่าวถึงก่อนหน้านี้ ต่อไปนี้เป็นรายการการเปลี่ยนเส้นทางที่เป็นไปได้ Bq n เป็นจำนวนที่เลือกได้เช่นเดียวกับใน `3 '(ไม่ใช่' Bq 3 'ซึ่งหมายถึง descriptor ไฟล์ n> ไฟล์ เปลี่ยนเส้นทางเอาท์พุทมาตรฐาน (หรือ n) ไปยังแฟ้ม n> | ไฟล์ เดียวกัน แต่แทนที่ -C ตัวเลือก n >> ไฟล์ ผนวกเอาต์พุตมาตรฐาน (หรือ n) เพื่อเก็บไฟล์ n <ไฟล์ เปลี่ยนเส้นทางการป้อนข้อมูลมาตรฐาน (หรือ n) จากไฟล์ n1 <& n2 อินพุตมาตรฐานที่ซ้ำกัน (หรือ n1) จาก descriptor ไฟล์ n2 n <& - ปิดการป้อนข้อมูลมาตรฐาน (หรือ n) n1> & n2 เอาต์พุตมาตรฐานที่ซ้ำกัน (หรือ n1) จาก n2 n> & - ปิดเอาต์พุตมาตรฐาน (หรือ n) n <> ไฟล์ เปิดไฟล์สำหรับอ่านและเขียนข้อมูลในอินพุตมาตรฐาน (หรือ n) การเปลี่ยนเส้นทางต่อไปนี้มักเรียกว่า `` นี่เอกสาร '' n << ตัวคั่น ที่นี่ข้อความ doc … คั่น ข้อความทั้งหมดในบรรทัดถัดไปถึงตัวคั่นจะถูกบันทึกไว้และให้คำสั่งในการป้อนข้อมูลมาตรฐานหรือตัวบอกไฟล์ n หากมีการระบุไว้ถ้าตัวคั่นตามที่ระบุไว้ในบรรทัดเริ่มต้นถูกยกมาแล้วข้อความ here-doc จะได้รับการปฏิบัติตามตัวอักษรอย่างอื่นมิฉะนั้นข้อความจะขึ้นอยู่กับการขยายพารามิเตอร์การแทนที่คำสั่งและการขยายตัวทางคณิตศาสตร์ (ตามที่อธิบายไว้ในส่วน "การขยาย") 'ถ้าโอเปอเรเตอร์เป็น `` << -' 'แทน `` <<' 'จากนั้นแท็บชั้นนำในเอกสาร doc นี้จะถูกตัดออก มีคำสั่งสามแบบ ได้แก่ ฟังก์ชัน shell คำสั่ง builtin และโปรแกรมปกติ - และค้นหาคำสั่ง (ตามชื่อ) ตามลำดับนั้น พวกเขาแต่ละคนจะถูกประหารชีวิตในลักษณะที่ต่างออกไป พารามิเตอร์เชลล์ทั้งหมด (ยกเว้น $ 0 ซึ่งยังคงไม่เปลี่ยนแปลง) ถูกตั้งค่าเป็นอาร์กิวเมนต์ของฟังก์ชันเชลล์ ตัวแปรที่ถูกวางไว้อย่างชัดเจนในสภาวะแวดล้อมของคำสั่ง (โดยการวางการกำหนดให้กับฟังก์ชันเหล่านี้ก่อนชื่อฟังก์ชัน) จะถูกสร้างขึ้นภายในฟังก์ชันและตั้งค่าเป็นค่าที่กำหนด จากนั้นคำสั่งที่ระบุในคำจำกัดความฟังก์ชันจะถูกดำเนินการ พารามิเตอร์ตำแหน่งจะคืนค่าเป็นค่าเดิมเมื่อคำสั่งเสร็จสิ้น ทั้งหมดนี้เกิดขึ้นภายในเปลือกปัจจุบัน เชลล์ builtins จะถูกดำเนินการภายในสู่เชลล์โดยไม่ต้องพลิกโฉมกระบวนการใหม่ มิฉะนั้นถ้าชื่อคำสั่งไม่ตรงกับฟังก์ชั่นหรือ builtin คำสั่งจะค้นหาเป็นโปรแกรมปกติในระบบแฟ้ม (ตามที่อธิบายไว้ในส่วนถัดไป) เมื่อรันโปรแกรมปกติเปลือกจะรันโปรแกรมโดยส่งอาร์กิวเมนต์และสภาพแวดล้อมไปยังโปรแกรม หากโปรแกรมไม่ใช่ไฟล์ปฏิบัติการปกติ (กล่าวคือถ้ามันไม่ได้ขึ้นต้นด้วย "magic number" ด้วย)ASCII แทนคือ "#!" ดังนั้น execve (2) ส่งกลับ Er ENOEXEC แล้ว) เปลือกจะตีความโปรแกรมใน subshell เปลือกลูกน้อยจะเริ่มต้นใหม่ในกรณีนี้เพื่อให้ผลกระทบจะเหมือนกับว่ามีการเรียกใช้เชลล์ใหม่เพื่อจัดการกับสคริปต์เชลล์ ad-hoc ยกเว้นว่าตำแหน่งของคำสั่งแฮชที่อยู่ในเชลล์ของแม่จะจำได้โดย เด็ก. โปรดทราบว่าเวอร์ชันก่อนหน้าของเอกสารนี้และซอร์สโค้ดเองที่ทำให้เข้าใจผิดและไม่ต่อเนื่องอ้างถึงสคริปต์เชลล์โดยไม่มีหมายเลขมายากลเป็น "กระบวนงานเชลล์" เมื่อค้นหาคำสั่ง shell ก่อนจะดูว่ามีฟังก์ชัน shell โดยใช้ชื่อดังกล่าวหรือไม่ จากนั้นจะมองหาคำสั่ง builtin โดยใช้ชื่อนั้น ถ้าไม่พบคำสั่งที่สร้างขึ้นหนึ่งในสองสิ่งเกิดขึ้น: ชื่อคำสั่งที่มีเครื่องหมายทับจะถูกดำเนินการโดยไม่ต้องทำการค้นหาใด ๆ เปลือกค้นหาแต่ละรายการเข้าเส้นทาง ในทางกลับกันสำหรับคำสั่ง ค่าของเส้นทางตัวแปรควรเป็นชุดรายการที่คั่นด้วยเครื่องหมายทวิภาค แต่ละรายการประกอบด้วยชื่อไดเรกทอรี ไดเร็กทอรีปัจจุบันอาจถูกระบุโดยปริยายโดยใช้ชื่อไดเร็กทอรีว่างหรืออย่างชัดเจนภายในช่วงเวลาเดียว Command Exit Status คำสั่งแต่ละคำมีสถานะทางออกที่สามารถมีอิทธิพลต่อพฤติกรรมของคำสั่งเชลล์อื่น ๆ ได้ กระบวนทัศน์คือคำสั่งออกมาพร้อมกับศูนย์สำหรับความปกติหรือความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลวข้อผิดพลาดหรือข้อบ่งชี้ที่ไม่ถูกต้อง หน้าคนสำหรับแต่ละคำสั่งควรระบุรหัสทางออกต่างๆและความหมาย นอกจากนี้คำสั่ง builtin ส่งกลับรหัสออกเช่นเดียวกับฟังก์ชันเชลล์ดำเนินการ คำสั่งที่ซับซ้อนคือการรวมกันของคำสั่งง่ายๆกับตัวควบคุมหรือคำสงวนพร้อมกันในการสร้างคำสั่งที่มีขนาดใหญ่ขึ้น โดยทั่วไปคำสั่งคือหนึ่งในต่อไปนี้: สถานะทางออกของคำสั่งคือคำสั่งง่ายๆที่ดำเนินการโดยคำสั่งสุดท้าย ท่อเป็นลำดับหนึ่งหรือหลายคำสั่งที่คั่นด้วยตัวควบคุมโอเปอเรเตอร์ เอาต์พุตมาตรฐานของคำสั่งทั้งหมด แต่คำสั่งสุดท้ายถูกเชื่อมต่อกับอินพุตมาตรฐานของคำสั่งถัดไป เอาท์พุทมาตรฐานของคำสั่งสุดท้ายถูกสืบทอดมาจากเชลล์ตามปกติ รูปแบบของท่อคือ: ! command1 | command2 … เอาต์พุตมาตรฐานของ command1 เชื่อมต่อกับอินพุตมาตรฐานของ command2 อินพุตมาตรฐานเอาท์พุทมาตรฐานหรือทั้งสองคำสั่งจะถูกกำหนดให้เป็นไปตามท่อก่อนการเปลี่ยนเส้นทางที่ระบุโดยผู้ให้บริการการเปลี่ยนเส้นทางซึ่งเป็นส่วนหนึ่งของคำสั่ง ถ้าท่อไม่ได้อยู่ในพื้นหลัง (อธิบายไว้ในภายหลัง) เชลล์รอคำสั่งทั้งหมดให้เสร็จสมบูรณ์ ถ้าคำสงวนไว้! ไม่นำหน้าท่อสถานะออกเป็นสถานะทางออกของคำสั่งสุดท้ายที่ระบุไว้ในท่อ มิฉะนั้นสถานะออกเป็นตรรกะไม่ของสถานะออกของคำสั่งสุดท้าย นั่นคือถ้าคำสั่งสุดท้ายส่งกลับเป็นศูนย์สถานะทางออกคือ 1; ถ้าคำสั่งสุดท้ายส่งกลับค่ามากกว่าศูนย์สถานะทางออกจะเป็นศูนย์ เนื่องจากการกำหนดค่าท่อของอินพุตมาตรฐานหรือเอาต์พุตมาตรฐานหรือทั้งสองอย่างเกิดขึ้นก่อนการเปลี่ยนเส้นทางคุณสามารถแก้ไขได้โดยการเปลี่ยนเส้นทาง ตัวอย่างเช่น: $ command1 2> & 1 | Command2 ส่งออกทั้งมาตรฐานและข้อผิดพลาดมาตรฐานของ command1 ไปยังอินพุตมาตรฐานของ command2 A; หรือ โปรดสังเกตว่าแตกต่างจากเปลือกหอยอื่น ๆ แต่ละกระบวนการในท่อเป็นเด็กของเปลือก invoking (ยกเว้นกรณีที่เป็น builtin เปลือกซึ่งในกรณีนี้จะดำเนินการในเปลือกปัจจุบัน - แต่ผลกระทบใด ๆ ที่มีต่อสิ่งแวดล้อมจะถูกเช็ด) ถ้าคำสั่งถูกยกเลิกโดยตัวควบคุมโอเปอเรเตอร์ (&) เปลือกจะรันคำสั่ง asynchronously - นั่นคือเปลือกไม่รอให้คำสั่งเสร็จสิ้นก่อนที่จะรันคำสั่งถัดไป รูปแบบการเรียกใช้คำสั่งในพื้นหลังคือ: command1 & command2 & … ถ้าเชลล์ไม่โต้ตอบอินพุตมาตรฐานของคำสั่งแบบอะซิงโครนัสถูกตั้งค่าเป็น / dev / null รายการคือลำดับของศูนย์หรือมากกว่าคำสั่งที่คั่นด้วยบรรทัดใหม่เครื่องหมายอัฒภาคหรือเครื่องหมายอัศเจรีย์และอาจถูกยกเลิกโดยหนึ่งในสามตัวนี้ คำสั่งในรายการจะถูกดำเนินการตามลำดับที่เขียนไว้ ถ้ามีคำสั่งตามด้วยเครื่องหมายอัชเชอร์เปลือกจะเริ่มคำสั่งและดำเนินการกับคำสั่งถัดไปทันที มิฉะนั้นจะรอคำสั่งให้ยุติก่อนที่จะดำเนินการต่อไป `` && '' และ `` || 'เป็นโอเปอเรเตอร์ AND หรือ OR `` && 'รันคำสั่งแรกแล้วรันคำสั่งที่สองและออกจากสถานะ exit ของคำสั่งแรกเป็นศูนย์ `` || '' จะคล้ายกัน แต่รันคำสั่งที่สองและออกจากสถานะ exit ของคำสั่งแรกคือไม่ใช่ศูนย์ `` && '' และ `` || '' ทั้งสองมีลำดับความสำคัญเท่ากัน ไวยากรณ์ของคำสั่ง If คือ ถ้ารายการ แล้วรายการ รายการ elif แล้วรายการ … รายการอื่น Fi ไวยากรณ์ของคำสั่ง while คือ ในขณะที่รายการ ทำรายการ เสร็จแล้ว ทั้งสองรายการจะถูกทำซ้ำ ๆ ในขณะที่สถานะการออกจากรายการแรกเป็นศูนย์ คำสั่งจนกว่าจะเหมือนกัน แต่มีคำจนกระทั่งในขณะที่ซึ่งทำให้มันซ้ำจนกว่าสถานะทางออกของรายการแรกเป็นศูนย์ ไวยากรณ์ของคำสั่ง for คือ สำหรับตัวแปรในคำ … ทำรายการ เสร็จแล้ว คำที่ถูกขยายจากนั้นรายการจะถูกดำเนินการซ้ำ ๆ พร้อมกับตัวแปรที่กำหนดให้กับแต่ละคำในทางกลับกัน ทำและทำอาจถูกแทนที่ด้วย `` {'' และ ``} '' ไวยากรณ์ของคำสั่งแบ่งและดำเนินการต่อคือ แบ่ง num ต่อ num Break จะยุติเลขภายในสุดสำหรับหรือในขณะที่ลูป ดำเนินการต่อโดยทำซ้ำซ้ำกันของวงด้านในสุด เหล่านี้ใช้เป็นคำสั่ง builtin ไวยากรณ์ของคำสั่ง case คือ คำในกรณี รูปแบบ) รายการ ;; … esac รูปแบบสามารถเป็นรูปแบบได้มากกว่าหนึ่งรูปแบบ (ดูรูปแบบเชลล์ที่อธิบายไว้ในภายหลัง) โดยคั่นด้วยอักขระ `` ' คำสั่งอาจถูกจัดกลุ่มโดยการเขียนอย่างใดอย่างหนึ่ง (รายการ) หรือ {list; ครั้งแรกของคำสั่งเหล่านี้จะดำเนินการใน subshell คำสั่ง Builtin ที่ถูกจัดกลุ่มลงใน (รายการ) จะไม่มีผลกับเชลล์ปัจจุบัน แบบฟอร์มที่สองไม่ได้ทำให้ส้อมเปลือกอีกครั้งเพื่อให้มีประสิทธิภาพมากขึ้นเล็กน้อย การจัดกลุ่มคำสั่งด้วยวิธีนี้จะช่วยให้คุณสามารถเปลี่ยนเส้นทางเอาท์พุทได้ราวกับว่าเป็นหนึ่งโปรแกรม: {printf สวัสดี; printf world n ";}> ทักทาย ฟังก์ชั่น ไวยากรณ์ของนิยามฟังก์ชันคือ ชื่อ () คำสั่ง คำจำกัดความของฟังก์ชันคือคำสั่งปฏิบัติการ เมื่อดำเนินการมันจะติดตั้งฟังก์ชันชื่อชื่อและส่งกลับสถานะการออกจากศูนย์ คำสั่งนี้เป็นรายการที่ล้อมรอบระหว่าง `` '' และ ``} '' ตัวแปรอาจได้รับการบอกกล่าวให้เป็นฟังก์ชันภายในโดยใช้คำสั่งภายในเครื่อง นี้ควรปรากฏเป็นคำสั่งแรกของฟังก์ชันและไวยากรณ์คือ ตัวแปรท้องถิ่น - … Local ถูกใช้เป็นคำสั่ง builtin เมื่อตัวแปรถูกสร้างขึ้นภายในจะรับค่าเริ่มต้นและแฟล็กที่ส่งออกและอ่านได้จากตัวแปรที่มีชื่อเดียวกันในขอบเขตโดยรอบถ้ามี มิฉะนั้นตัวแปรจะถูกยกเลิกการเริ่มต้น เปลือกใช้การกำหนดขอบเขตแบบไดนามิกดังนั้นถ้าคุณสร้างตัวแปร x local เพื่อทำหน้าที่ f ซึ่งจะเรียกใช้ฟังก์ชัน g การอ้างอิงไปยังตัวแปร x ที่สร้างขึ้นภายใน g จะอ้างถึงตัวแปร x ที่ประกาศไว้ภายใน f ไม่ใช่ตัวแปรระดับโลกที่ชื่อ x . พารามิเตอร์เฉพาะพิเศษที่สามารถทำได้ในท้องถิ่นคือ `` - '' `` `'`' `'` ``' `local 'ตัวเลือกใด ๆ ที่เปลือกที่มีการเปลี่ยนแปลงผ่านคำสั่งชุดภายในฟังก์ชันที่จะเรียกคืนไปยังค่าเดิมของพวกเขาเมื่อกลับมาทำงาน ไวยากรณ์ของคำสั่ง return คือ กลับ exitstatus จะยุติการทำงานในปัจจุบัน การส่งคืนถูกใช้เป็นคำสั่ง builtin เปลือกเก็บชุดของพารามิเตอร์ พารามิเตอร์ที่แสดงด้วยชื่อเรียกว่าตัวแปร เมื่อเริ่มต้นเปลือกจะเปลี่ยนตัวแปรสภาพแวดล้อมทั้งหมดให้เป็นตัวแปรเชลล์ ตัวแปรใหม่สามารถตั้งค่าได้โดยใช้แบบฟอร์ม ชื่อ = ค่า ตัวแปรที่กำหนดโดยผู้ใช้จะต้องมีชื่อที่ประกอบไปด้วยตัวอักษรตัวเลขและเครื่องหมายขีดล่างเท่านั้นซึ่งส่วนแรกต้องไม่เป็นตัวเลข พารามิเตอร์สามารถระบุด้วยตัวเลขหรืออักขระพิเศษตามที่อธิบายด้านล่าง พารามิเตอร์ตำแหน่งเป็นพารามิเตอร์ที่ระบุด้วยตัวเลข (n> 0) เชลล์กำหนดค่าเริ่มต้นเหล่านี้เป็นค่าอาร์กิวเมนต์บรรทัดคำสั่งที่ทำตามชื่อของเชลล์สคริปต์ ชุดที่ตั้ง (1) ยังสามารถใช้เพื่อตั้งค่าหรือรีเซ็ตได้ พารามิเตอร์พิเศษคือพารามิเตอร์ที่แสดงด้วยอักขระพิเศษใด ๆ ต่อไปนี้ ค่าของพารามิเตอร์จะแสดงอยู่ถัดจากอักขระ * ขยายไปยังพารามิเตอร์ตำแหน่งจากจุดเริ่มต้น เมื่อการขยายตัวเกิดขึ้นภายในสตริงที่ยกมาสองครั้งจะขยายเป็นฟิลด์เดียวที่มีค่าของพารามิเตอร์แต่ละตัวคั่นด้วยอักขระตัวแรกของไอเอฟเอ ตัวแปรหรือโดย a @ ขยายไปยังพารามิเตอร์ตำแหน่งจากจุดเริ่มต้นเมื่อการขยายตัวเกิดขึ้นภายในเครื่องหมายคำพูดสองครั้งแต่ละพารามิเตอร์ตำแหน่งจะขยายเป็นอาร์กิวเมนต์ที่แยกต่างหาก ถ้าไม่มีพารามิเตอร์ตำแหน่งการขยายตัวของ @ สร้างอาร์กิวเมนต์เป็นศูนย์แม้ว่าจะมีการยกมาสองครั้งก็ตาม สิ่งนี้โดยทั่วไปหมายถึงตัวอย่างเช่นถ้า $ 1 เป็น `` abc '' และ $ 2 เป็น `` def ghi '' แล้ว Qq $ @ ขยายไปสองข้อขัดแย้ง: abc def ghi # ขยายไปยังหมายเลขของพารามิเตอร์ตำแหน่ง ? ขยายไปสู่สถานะทางออกของท่อล่าสุด - (ยัติภังค์) ขยายไปยังแฟล็กตัวเลือกปัจจุบัน (ชื่อตัวเลือกตัวอักษรเดียวที่รวมเป็นสตริง) ตามที่ระบุไว้ในคำร้องโดยคำสั่ง builtin ชุดหรือโดยปริยายโดยเปลือก $ ขยายไปยัง ID กระบวนการของเชลล์ที่อ้างถึง Subshell ยังคงมีค่าเท่ากับ $ เป็นค่าเริ่มต้น ! ขยายไปยัง ID กระบวนการของคำสั่งพื้นหลังล่าสุดที่ดำเนินการจากเชลล์ปัจจุบัน สำหรับกระบวนการวางท่อรหัสกระบวนการคือคำสั่งสุดท้ายของท่อ 0 (ศูนย์) ขยายไปยังชื่อของเชลล์หรือเชลล์สคริปต์ การขยายคำ ประโยคนี้อธิบายการขยายต่างๆที่ทำขึ้นในคำ ไม่ใช่การขยายทั้งหมดในทุกคำตามที่อธิบายไว้ในภายหลัง การขยายตัวหน่วงการขยายพารามิเตอร์การแทนที่คำสั่งการขยายเลขคณิตและการลบคำพูดที่เกิดขึ้นภายในคำเดียวจะขยายไปยังฟิลด์เดียว เป็นเพียงการแบ่งฟิลด์หรือการขยายพา ธ ที่สามารถสร้างหลายฟิลด์จากคำเดียวได้ ข้อยกเว้นเดียวกับกฎนี้คือการขยายตัวของพารามิเตอร์พิเศษ @ ภายในเครื่องหมายคำพูดสองครั้งตามที่ได้อธิบายไว้ข้างต้น ลำดับของการขยายคำคือ: การขยายตัวหนอนตัวขยายตัวพารามิเตอร์การทดแทนคำสั่งการขยายตัวทางคณิตศาสตร์ (ทั้งหมดนี้เกิดขึ้นพร้อมกัน) การแบ่งฟิลด์จะดำเนินการในฟิลด์ที่สร้างขึ้นตามขั้นตอน (1) เว้นแต่ไอเอฟเอ ตัวแปรเป็น null การขยายเส้นทาง (ยกเว้นที่ตั้งไว้ -ฉ มีผล) การลบคำแนะนำ อักขระ $ ใช้เพื่อแนะนำการขยายพารามิเตอร์การแทนที่คำสั่งหรือการประเมินเลขคณิต คำที่ขึ้นต้นด้วยอักขระทิลเดอ (~) ที่ไม่มีการอ้างอิงจะอยู่ภายใต้การขยายไทิลด์ อักขระทั้งหมดที่มีเครื่องหมายทับ (/) หรือคำท้ายคำจะถือว่าเป็นชื่อผู้ใช้และถูกแทนที่ด้วยไดเรกทอรีภายในของผู้ใช้ หากชื่อผู้ใช้หายไป (เช่นใน ~ / foobar) เครื่องหมายทับจะถูกแทนที่ด้วยค่าของ บ้าน ตัวแปร (ไดเร็กทอรีโฮมของผู้ใช้ปัจจุบัน) รูปแบบสำหรับการขยายพารามิเตอร์มีดังนี้: $ {} แสดงออก ซึ่งนิพจน์ประกอบด้วยอักขระทั้งหมดจนกว่าจะมีการจับคู่ ``} '' '`` `` ``' 'ใด ๆ ที่ถูกหนีออกโดยเครื่องหมายทับขวาหรือภายในสตริงที่ยกมาและอักขระในการขยายตัวทางคณิตศาสตร์แบบฝังตัวการแทนที่คำสั่งและการขยายตัวแปรจะไม่ถูกตรวจสอบในการกำหนด จับคู่ ``} '' รูปแบบที่ง่ายที่สุดสำหรับการขยายพารามิเตอร์คือ: $ {} พารามิเตอร์ ค่าถ้ามีพารามิเตอร์ถูกแทนที่ ชื่อพารามิเตอร์หรือสัญลักษณ์สามารถใส่ไว้ในเครื่องหมายวงเล็บซึ่งเป็นตัวเลือกยกเว้นพารามิเตอร์ตำแหน่งที่มีมากกว่าหนึ่งหลักหรือเมื่อมีพารามิเตอร์ตามด้วยอักขระที่สามารถตีความได้ว่าเป็นส่วนหนึ่งของชื่อ หากมีการขยายพารามิเตอร์เกิดขึ้นภายในเครื่องหมายคำพูดคู่: การขยายเส้นทางจะไม่ดำเนินการกับผลลัพธ์ของการขยาย การแยกฟิลด์ไม่ได้ทำกับผลลัพธ์ของการขยายตัวยกเว้น @ นอกจากนี้ยังสามารถปรับเปลี่ยนพารามิเตอร์ได้โดยใช้รูปแบบใดรูปแบบหนึ่งดังต่อไปนี้ $ {พารามิเตอร์: -word} ใช้ค่าเริ่มต้น หากพารามิเตอร์ถูก unset หรือ null การขยายคำจะถูกแทนที่; มิฉะนั้นค่าของพารามิเตอร์จะถูกแทนที่ $ {พารามิเตอร์ = คำ} กำหนดค่าเริ่มต้น ถ้าพารามิเตอร์ถูก unset หรือ null การขยายคำจะถูกกำหนดให้กับพารามิเตอร์ ในทุกกรณีค่าสุดท้ายของพารามิเตอร์จะถูกแทนที่ สามารถกำหนดได้เฉพาะตัวแปรไม่ใช่พารามิเตอร์ตำแหน่งหรือพารามิเตอร์พิเศษเท่านั้น $ {พารามิเตอร์: คำ} ระบุข้อผิดพลาดถ้า Null หรือ Unset ถ้าพารามิเตอร์ถูก unset หรือ null การขยายคำ (หรือข้อความที่ระบุว่าไม่มีการตั้งค่าไว้ถ้า word ถูกละไว้) จะถูกเขียนลงในข้อผิดพลาดมาตรฐานและ shell ออกจากสถานะ exit มิฉะนั้นค่าของพารามิเตอร์จะถูกแทนที่ ปลั๊กอินแบบโต้ตอบไม่จำเป็นต้องออก $ {พารามิเตอร์: + คำ} ใช้ค่าทางเลือก ถ้าพารามิเตอร์ถูก unset หรือ null, null จะถูกแทนที่; มิฉะนั้นการขยายคำจะถูกแทนที่ ในการขยายค่าพารามิเตอร์ที่แสดงไว้ก่อนหน้านี้ให้ใช้เครื่องหมายทวิภาคในผลลัพธ์รูปแบบในการทดสอบพารามิเตอร์ที่ไม่ได้ตั้งค่าหรือเป็นโมฆะ การละเลยผลของลำไส้ใหญ่ในการทดสอบสำหรับพารามิเตอร์ที่ถูกลบเท่านั้น $ {#} พารามิเตอร์ ความยาวสายอักขระ ความยาวในตัวอักษรของค่าของพารามิเตอร์ การขยายตัวพารามิเตอร์สี่ชนิดต่อไปนี้มีไว้สำหรับการประมวลผล substring ในแต่ละกรณีสัญกรณ์การจับคู่รูปแบบ (ดูรูปแบบเชลล์) แทนที่จะเป็นสัญกรณ์นิพจน์ปกติจะใช้ในการประเมินรูปแบบ ถ้าพารามิเตอร์เป็น * หรือ @ ผลลัพธ์ของการขยายคือไม่ระบุ การใส่สตริงการขยายพารามิเตอร์ทั้งหมดในเครื่องหมายคำพูดสองครั้งจะไม่ทำให้อักขระรูปแบบทั้งสี่แบบต่อไปนี้ถูกยกมาในขณะที่อักขระ quoting ภายในเครื่องหมายวงเล็บมีผลนี้ $ {% พารามิเตอร์คำ} ลบรูปแบบ Suffix ที่เล็กที่สุด คำขยายเพื่อสร้างรูปแบบ การขยายพารามิเตอร์จะส่งผลให้พารามิเตอร์มีส่วนที่เล็กที่สุดของส่วนต่
quoting
ทับขวา
คำคมเดี่ยว
คำพูดคู่
คำสงวน
นามแฝง
คำสั่ง
คำสั่งง่ายๆ
การค้นหาและการดำเนินการ
การค้นหาเส้นทาง
คำสั่งที่ซับซ้อน
ท่อ
คำสั่งพื้นหลัง -
รายการ - พูดโดยทั่วไป
ผู้ประกอบการวงจรรายชื่อสั้น
โครงสร้างควบคุมการไหล - ถ้าในขณะที่สำหรับกรณี
จัดกลุ่มคำสั่งด้วยกัน
ตัวแปรและพารามิเตอร์
พารามิเตอร์ตำแหน่ง
พารามิเตอร์พิเศษ
การขยายตัวหนอน (แทนโฮมไดเร็กตอรี่ของผู้ใช้)
การขยายค่าพารามิเตอร์




