Skip to main content

Ash - คำสั่ง Linux

ขี้เถ้า - เบ็น ศรัณยู :เซิ้ง|Music [Story ไทบ้านเดอะซีรีส์]【Official MV】 (มิถุนายน 2026)

ขี้เถ้า - เบ็น ศรัณยู :เซิ้ง|Music [Story ไทบ้านเดอะซีรีส์]【Official MV】 (มิถุนายน 2026)

:

Anonim

ชื่อ

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

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 ก็รู้จักคำสั่งง่ายๆ มิฉะนั้นอาจได้รับการยอมรับคำสั่งที่ซับซ้อนหรือสิ่งก่อสร้างพิเศษอื่น ๆ

คำสั่งง่ายๆ

หากมีการรู้จักคำสั่งง่ายๆเปลือกจะดำเนินการต่อไปนี้:

  1. คำนำหน้าของรูปแบบ `` name = value '' ถูกตัดออกและกำหนดให้กับสภาพแวดล้อมของคำสั่งง่ายๆ ผู้ให้บริการการเปลี่ยนเส้นทางและอาร์กิวเมนต์ของตน (ตามที่อธิบายไว้ด้านล่าง) จะถูกตัดออกและบันทึกไว้สำหรับการประมวลผล

  2. คำที่เหลือจะขยายตามที่อธิบายไว้ในส่วนที่เรียกว่า `` Expansions '' และคำแรกที่เหลือจะถือว่าเป็นชื่อคำสั่งและคำสั่งจะอยู่ คำที่เหลือจะถือว่าเป็นอาร์กิวเมนต์ของคำสั่ง ถ้าไม่มีชื่อคำสั่งเกิดขึ้น `` name = value '' การกำหนดตัวแปรที่ได้รับการยอมรับในข้อ 1 ส่งผลต่อเชลล์ปัจจุบัน

  3. การเปลี่ยนเส้นทางจะดำเนินการตามที่อธิบายไว้ในส่วนถัดไป

การเปลี่ยนเส้นทาง

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

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 โดยใช้ชื่อนั้น ถ้าไม่พบคำสั่งที่สร้างขึ้นหนึ่งในสองสิ่งเกิดขึ้น:

  1. ชื่อคำสั่งที่มีเครื่องหมายทับจะถูกดำเนินการโดยไม่ต้องทำการค้นหาใด ๆ

  2. เปลือกค้นหาแต่ละรายการเข้าเส้นทาง ในทางกลับกันสำหรับคำสั่ง ค่าของเส้นทางตัวแปรควรเป็นชุดรายการที่คั่นด้วยเครื่องหมายทวิภาค แต่ละรายการประกอบด้วยชื่อไดเรกทอรี ไดเร็กทอรีปัจจุบันอาจถูกระบุโดยปริยายโดยใช้ชื่อไดเร็กทอรีว่างหรืออย่างชัดเจนภายในช่วงเวลาเดียว

Command Exit Status

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

คำสั่งที่ซับซ้อน

คำสั่งที่ซับซ้อนคือการรวมกันของคำสั่งง่ายๆกับตัวควบคุมหรือคำสงวนพร้อมกันในการสร้างคำสั่งที่มีขนาดใหญ่ขึ้น โดยทั่วไปคำสั่งคือหนึ่งในต่อไปนี้:

  • คำสั่งง่ายๆ
  • ท่อ
  • รายการหรือสารประกอบรายการ
  • คำสั่งผสม
  • นิยามฟังก์ชัน

สถานะทางออกของคำสั่งคือคำสั่งง่ายๆที่ดำเนินการโดยคำสั่งสุดท้าย

ท่อ

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

รูปแบบของท่อคือ:

! command1 | command2 …

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

ถ้าท่อไม่ได้อยู่ในพื้นหลัง (อธิบายไว้ในภายหลัง) เชลล์รอคำสั่งทั้งหมดให้เสร็จสมบูรณ์

ถ้าคำสงวนไว้! ไม่นำหน้าท่อสถานะออกเป็นสถานะทางออกของคำสั่งสุดท้ายที่ระบุไว้ในท่อ มิฉะนั้นสถานะออกเป็นตรรกะไม่ของสถานะออกของคำสั่งสุดท้าย นั่นคือถ้าคำสั่งสุดท้ายส่งกลับเป็นศูนย์สถานะทางออกคือ 1; ถ้าคำสั่งสุดท้ายส่งกลับค่ามากกว่าศูนย์สถานะทางออกจะเป็นศูนย์

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

$ command1 2> & 1 | Command2

ส่งออกทั้งมาตรฐานและข้อผิดพลาดมาตรฐานของ command1 ไปยังอินพุตมาตรฐานของ command2

A; หรือ terminator ก่อให้เกิดรายการ AND-OR- ก่อนหน้า (อธิบายต่อไป) เพื่อดำเนินการตามลำดับ a และทำให้เกิดการทำงานแบบอะซิงโครนัสของรายการ AND-OR-ก่อนหน้า

โปรดสังเกตว่าแตกต่างจากเปลือกหอยอื่น ๆ แต่ละกระบวนการในท่อเป็นเด็กของเปลือก 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. การขยายตัวหนอนตัวขยายตัวพารามิเตอร์การทดแทนคำสั่งการขยายตัวทางคณิตศาสตร์ (ทั้งหมดนี้เกิดขึ้นพร้อมกัน)

  2. การแบ่งฟิลด์จะดำเนินการในฟิลด์ที่สร้างขึ้นตามขั้นตอน (1) เว้นแต่ไอเอฟเอ ตัวแปรเป็น null

  3. การขยายเส้นทาง (ยกเว้นที่ตั้งไว้ - มีผล)

  4. การลบคำแนะนำ

อักขระ $ ใช้เพื่อแนะนำการขยายพารามิเตอร์การแทนที่คำสั่งหรือการประเมินเลขคณิต

การขยายตัวหนอน (แทนโฮมไดเร็กตอรี่ของผู้ใช้)

คำที่ขึ้นต้นด้วยอักขระทิลเดอ (~) ที่ไม่มีการอ้างอิงจะอยู่ภายใต้การขยายไทิลด์ อักขระทั้งหมดที่มีเครื่องหมายทับ (/) หรือคำท้ายคำจะถือว่าเป็นชื่อผู้ใช้และถูกแทนที่ด้วยไดเรกทอรีภายในของผู้ใช้ หากชื่อผู้ใช้หายไป (เช่นใน ~ / foobar) เครื่องหมายทับจะถูกแทนที่ด้วยค่าของ บ้าน ตัวแปร (ไดเร็กทอรีโฮมของผู้ใช้ปัจจุบัน)

การขยายค่าพารามิเตอร์

รูปแบบสำหรับการขยายพารามิเตอร์มีดังนี้:

$ {} แสดงออก

ซึ่งนิพจน์ประกอบด้วยอักขระทั้งหมดจนกว่าจะมีการจับคู่ ``} '' '`` `` ``' 'ใด ๆ ที่ถูกหนีออกโดยเครื่องหมายทับขวาหรือภายในสตริงที่ยกมาและอักขระในการขยายตัวทางคณิตศาสตร์แบบฝังตัวการแทนที่คำสั่งและการขยายตัวแปรจะไม่ถูกตรวจสอบในการกำหนด จับคู่ ``} ''

รูปแบบที่ง่ายที่สุดสำหรับการขยายพารามิเตอร์คือ:

$ {} พารามิเตอร์

ค่าถ้ามีพารามิเตอร์ถูกแทนที่

ชื่อพารามิเตอร์หรือสัญลักษณ์สามารถใส่ไว้ในเครื่องหมายวงเล็บซึ่งเป็นตัวเลือกยกเว้นพารามิเตอร์ตำแหน่งที่มีมากกว่าหนึ่งหลักหรือเมื่อมีพารามิเตอร์ตามด้วยอักขระที่สามารถตีความได้ว่าเป็นส่วนหนึ่งของชื่อ หากมีการขยายพารามิเตอร์เกิดขึ้นภายในเครื่องหมายคำพูดคู่:

  1. การขยายเส้นทางจะไม่ดำเนินการกับผลลัพธ์ของการขยาย

  2. การแยกฟิลด์ไม่ได้ทำกับผลลัพธ์ของการขยายตัวยกเว้น @

นอกจากนี้ยังสามารถปรับเปลี่ยนพารามิเตอร์ได้โดยใช้รูปแบบใดรูปแบบหนึ่งดังต่อไปนี้

$ {พารามิเตอร์: -word}

ใช้ค่าเริ่มต้น หากพารามิเตอร์ถูก unset หรือ null การขยายคำจะถูกแทนที่; มิฉะนั้นค่าของพารามิเตอร์จะถูกแทนที่

$ {พารามิเตอร์ = คำ}

กำหนดค่าเริ่มต้น ถ้าพารามิเตอร์ถูก unset หรือ null การขยายคำจะถูกกำหนดให้กับพารามิเตอร์ ในทุกกรณีค่าสุดท้ายของพารามิเตอร์จะถูกแทนที่ สามารถกำหนดได้เฉพาะตัวแปรไม่ใช่พารามิเตอร์ตำแหน่งหรือพารามิเตอร์พิเศษเท่านั้น

$ {พารามิเตอร์: คำ}

ระบุข้อผิดพลาดถ้า Null หรือ Unset ถ้าพารามิเตอร์ถูก unset หรือ null การขยายคำ (หรือข้อความที่ระบุว่าไม่มีการตั้งค่าไว้ถ้า word ถูกละไว้) จะถูกเขียนลงในข้อผิดพลาดมาตรฐานและ shell ออกจากสถานะ exit มิฉะนั้นค่าของพารามิเตอร์จะถูกแทนที่ ปลั๊กอินแบบโต้ตอบไม่จำเป็นต้องออก

$ {พารามิเตอร์: + คำ}

ใช้ค่าทางเลือก ถ้าพารามิเตอร์ถูก unset หรือ null, null จะถูกแทนที่; มิฉะนั้นการขยายคำจะถูกแทนที่

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

$ {#} พารามิเตอร์

ความยาวสายอักขระ ความยาวในตัวอักษรของค่าของพารามิเตอร์

การขยายตัวพารามิเตอร์สี่ชนิดต่อไปนี้มีไว้สำหรับการประมวลผล substring ในแต่ละกรณีสัญกรณ์การจับคู่รูปแบบ (ดูรูปแบบเชลล์) แทนที่จะเป็นสัญกรณ์นิพจน์ปกติจะใช้ในการประเมินรูปแบบ ถ้าพารามิเตอร์เป็น * หรือ @ ผลลัพธ์ของการขยายคือไม่ระบุ การใส่สตริงการขยายพารามิเตอร์ทั้งหมดในเครื่องหมายคำพูดสองครั้งจะไม่ทำให้อักขระรูปแบบทั้งสี่แบบต่อไปนี้ถูกยกมาในขณะที่อักขระ quoting ภายในเครื่องหมายวงเล็บมีผลนี้

$ {% พารามิเตอร์คำ}

ลบรูปแบบ Suffix ที่เล็กที่สุด คำขยายเพื่อสร้างรูปแบบ การขยายพารามิเตอร์จะส่งผลให้พารามิเตอร์มีส่วนที่เล็กที่สุดของส่วนต่