ทุบตี Subshells

Thubti Subshells



บางครั้ง คุณต้องเรียกใช้คำสั่งหรือสคริปต์ตั้งแต่หนึ่งคำสั่งขึ้นไปในเบื้องหลัง งานนี้สามารถทำได้โดยเขียนคำสั่งหรือสคริปต์ทั้งหมดลงในไฟล์สคริปต์และเรียกใช้งานไฟล์โดยใช้เครื่องหมายแอมเปอร์แซนด์ (&) หรือเรียกใช้งานคำสั่งหรือสคริปต์ลงในเชลล์ย่อยจากเชลล์ปัจจุบัน เชลล์ย่อยสามารถใช้เพื่อดำเนินการคำสั่งหรือสคริปต์หลายรายการโดยล้อมรอบด้วย $() หรือ backticks (`) วิธีการใช้ Bash subshell แสดงอยู่ในบทช่วยสอนนี้

ตัวอย่างของ Subshell แบบต่างๆ

วิธีต่างๆ ในการเรียกใช้งานสคริปต์ในเชลล์ย่อยจะแสดงในส่วนนี้ของบทช่วยสอน

ตัวอย่างที่ 1: ดำเนินการ Subshell โดยใช้ใบเสนอราคาเดี่ยวและใบเสนอราคาคู่

สร้างไฟล์ Bash ด้วยสคริปต์ต่อไปนี้ที่พิมพ์วันที่และเวลาปัจจุบัน ถัดไป ตัวแปร $strVal จะถูกพิมพ์โดยปิดสคริปต์ subshell ภายในเครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่







#!/bin/bash

#พิมพ์คำสั่ง `date` ใน subshell

เสียงสะท้อน 'วันนี้คือวัน `วันที่` '

#Define ตัวแปรสตริง

สตริวัล = 'ทุบตี Subshell'

#พิมพ์ตัวแปรในเชลล์ย่อยโดยใช้เครื่องหมายอัญประกาศเดี่ยว

เสียงสะท้อน 'ผลลัพธ์ของคำพูดเดี่ยว:' '$(เสียงสะท้อน $strVal)'

#พิมพ์ตัวแปรใน subshell โดยใช้เครื่องหมายอัญประกาศคู่

เสียงสะท้อน 'ผลลัพธ์ของอัญประกาศคู่:' ' $(เสียงสะท้อน $strVal) '

ผลลัพธ์ต่อไปนี้ปรากฏขึ้นหลังจากเรียกใช้งานสคริปต์ สคริปต์ย่อยถูกพิมพ์เป็นสตริงเมื่อปิดด้วยเครื่องหมายอัญประกาศเดี่ยว สคริปต์ย่อยถูกเรียกใช้งานเมื่อถูกปิดด้วยเครื่องหมายอัญประกาศคู่:





ตัวอย่างที่ 2: ค้นหาไฟล์ทั้งหมดของส่วนขยายเฉพาะโดยใช้เชลล์ย่อย

สร้างไฟล์ Bash ด้วยสคริปต์ต่อไปนี้ซึ่งใช้นามสกุลไฟล์เป็นอินพุตจากผู้ใช้ ถัดไป คำสั่ง “ls” จะถูกดำเนินการใน subshell เพื่อค้นหาไฟล์ทั้งหมดของนามสกุลนั้นๆ





#!/bin/bash

เสียงสะท้อน -น 'ป้อนชื่อนามสกุลไฟล์:'

#จดชื่อนามสกุลไฟล์ที่ต้องการค้นหา

อ่าน ต่อ

#ตรวจสอบค่าที่ป้อน

ถ้า [ [ $ต่อ == '' ] ] ; แล้ว

#พิมพ์ข้อความผิดพลาด

เสียงสะท้อน 'ไม่มีการขยายเวลา'

อื่น

เสียงสะท้อน 'ชื่อไฟล์ด้วย $ต่อ ส่วนขยาย:'

#พิมพ์ชื่อไฟล์ทั้งหมดพร้อมนามสกุลที่กำหนด

เสียงสะท้อน ' $( echo `ls *.$ext` ) '

เป็น

ผลลัพธ์ต่อไปนี้ปรากฏขึ้นหลังจากเรียกใช้สคริปต์ด้วยอินพุต 'txt' ตามผลลัพธ์ มีไฟล์ข้อความสามไฟล์อยู่ในตำแหน่งปัจจุบัน:



ผลลัพธ์ต่อไปนี้ปรากฏขึ้นหลังจากรันสคริปต์ด้วยค่าว่าง:

ตัวอย่างที่ 3: เรียกใช้นิพจน์เลขคณิตใน Subshell

สร้างไฟล์ Bash ด้วยสคริปต์ต่อไปนี้ซึ่งใช้ตัวแปรชื่อเดียวกันในเชลล์หลักและเชลล์ย่อย การดำเนินการทางคณิตศาสตร์ถูกกำหนดไว้ในเชลล์หลักและเชลล์ย่อย

#!/bin/bash

#Define ตัวแปรพาเรนต์เชลล์

ตัวเลข = 10

#พิมพ์ผลลัพธ์ตามตัวแปรของพาเรนต์เชลล์

( ( ผลลัพธ์ = จำนวน $ + 5 ) )

เสียงสะท้อน 'ผลรวมของ จำนวน $ +5= ผลลัพธ์ $ '

#สร้างตัวแปร subshell ด้วยชื่อเดียวกันกับ parent shell

( ตัวเลข = ยี่สิบ ; ( ( ผลลัพธ์ = จำนวน $ + 10 ) ) ; เสียงสะท้อน 'ผลรวมของ จำนวน $ +5= ผลลัพธ์ $ ' )

# พิมพ์ผลลัพธ์ตามตัวแปรของพาเรนต์เชลล์อีกครั้ง

เสียงสะท้อน 'ผลรวมของ จำนวน $ +5= ผลลัพธ์ $ '

ผลลัพธ์ต่อไปนี้ปรากฏขึ้นหลังจากเรียกใช้งานสคริปต์ เอาต์พุตแรกและเอาต์พุตสุดท้ายแสดงผลของเชลล์หลัก เอาต์พุตที่สองแสดงผลของเชลล์ย่อย ตัวแปรของเชลล์หลักไม่ถูกแก้ไขโดยตัวแปรของเชลล์ย่อย:

ตัวอย่างที่ 4: ดำเนินการหลายคำสั่งใน Subshell

สร้างไฟล์ Bash ด้วยสคริปต์ต่อไปนี้ที่ส่งออกคำสั่ง 'echo' ไปยังคำสั่ง 'sed' ที่แทนที่ค่าสตริงที่ตรงกันด้วยสตริงอื่น ผลลัพธ์ของคำสั่ง 'echo' คือ 'JavaScript' ดังนั้น ค่านี้จะถูกเปรียบเทียบกับ “Java” และ “JavaScript” หากพบการจับคู่ สตริงที่ตรงกันจะถูกแทนที่ด้วยสตริง 'ประเภท'

#!/bin/bash

#กำหนดค่าสตริง

สตริวัล = 'จาวาสคริปต์'

#พิมพ์ค่าสตริงเดิม

เสียงสะท้อน 'ค่าสตริง: $strVal '

#พิมพ์ค่า subshell

เสียงสะท้อน -น 'มูลค่าย่อย: '

เสียงสะท้อน ' $(echo $strVal | sed 's|Java|JavaScript Type|') '

ผลลัพธ์ต่อไปนี้ปรากฏขึ้นหลังจากเรียกใช้งานสคริปต์ ตามผลลัพธ์ สตริง “Java” จะถูกแทนที่ด้วยสตริง “Type” ผลลัพธ์ของ subshell คือ 'JavaScript TypeScript':


บทสรุป

คำสั่งหรือสคริปต์อย่างน้อยหนึ่งคำสั่งสามารถดำเนินการได้โดยใช้เชลล์ย่อยโดยไม่กระทบกับเชลล์หลัก มีการอธิบายวัตถุประสงค์ของการใช้ subshell ในบทช่วยสอนนี้โดยใช้หลายตัวอย่าง งานประเภทต่างๆ เช่น การค้นหาไฟล์ การคำนวณผลรวมของตัวเลข การแทนที่สตริง ฯลฯ ดำเนินการโดยเชลล์ย่อยในตัวอย่างที่กำหนด แนวคิดของการใช้ subshell นั้นแสดงให้เห็นอย่างถูกต้อง และผู้ใช้ Bash ใหม่จะสามารถใช้ subshell ได้หลังจากอ่านบทช่วยสอนนี้