Tìm hiểu cách chạy đúng Subshells bằng cách sử dụng tập lệnh Bash

Làm thế nào để hướng dẫn Subshells chạy song song trong nền

Một trình bao là một giao diện cơ bản để nhập các lệnh trên một hệ thống Linux. Với nó, bạn có thể nhập một lệnh trực tiếp hoặc chỉ định một tập tin (script) có chứa một chuỗi các lệnh được thực hiện. Các vỏ được tổ chức theo một hệ thống phân cấp và bất kỳ trình bao nào cũng có thể tạo một trình bao mới. Vỏ mới được coi là một tiến trình con - một vỏ con — của vỏ mẹ tạo ra nó.

Theo mặc định, một subshell phụ thuộc vào cha mẹ của nó theo nghĩa là nếu quá trình cha mẹ chấm dứt, subshell cũng chấm dứt. Bất kỳ đầu ra nào được truyền từ subshell đến shell cha.

Cách tạo Subshell

Trong một kịch bản shell Bash, bạn tạo một subshell bằng cách sử dụng ký hiệu ngoặc đơn:

#! / bin / bash echo "Trước khi bắt đầu subshell" (count = 1 trong khi [$ count -le 99] làm echo "$ count" sleep 1 ((count ++)) done) echo "Finished"

Trong ví dụ này, vòng lặp while được đặt trong dấu ngoặc đơn, khiến cho nó được thực hiện trong một vỏ con của trình bao mà tệp kịch bản lệnh được thực hiện.

Chạy một Subshell trong nền

Trừ khi bạn chỉ định rằng subshell sẽ được thực thi ở chế độ nền, shell cha sẽ đợi cho subshell kết thúc trước khi tiếp tục với phần còn lại của kịch bản. Tuy nhiên, nếu bạn muốn chạy subshells song song, bạn chạy chúng trong nền, được thực hiện với ký tự dấu và sau biểu thức subshell, như được hiển thị ở đây:

#! / bin / bash echo "Trước khi bắt đầu subshell" (count = 1 trong khi [$ count -le 99] làm echo "$ count" ngủ 1 ((count ++)) done) & echo "Finished"

Chạy nhiều Subshells trong song song

Nếu bạn tạo nhiều subshells làm các quá trình nền, bạn có thể chạy các tác vụ song song. Thông thường, hệ điều hành sử dụng các bộ xử lý hoặc lõi khác nhau cho mỗi tiến trình và tiến trình con, giả sử có ít nhất là nhiều bộ xử lý hoặc lõi như có các quy trình. Nếu không, các tác vụ được gán cho cùng một bộ xử lý hoặc lõi. Trong trường hợp đó, bộ xử lý hoặc lõi liên tục chuyển đổi giữa các tác vụ được giao cho đến khi các tác vụ được hoàn thành. Ví dụ tiếp theo có hai tiến trình con. Cái đầu tiên đếm từ 1 đến 99, và cái thứ hai từ 1000 đến 1099.

#! / bin / bash echo "Trước khi bắt đầu subshell" (count = 1 trong khi [$ count -le 99] làm echo "$ count" ngủ 1 ((count ++)) done) & (count = 1000 trong khi [$ count -le 1099] làm echo "$ count" ngủ 1 ((count ++)) done) & echo "Finished"

Sử dụng câu lệnh chờ để cho quá trình cha mẹ chờ các quy trình con hoàn thành trước khi tiếp tục với phần còn lại của tập lệnh:

#! / bin / bash echo "Trước khi bắt đầu subshell" (count = 1 trong khi [$ count -le 99] làm echo "$ count" ngủ 1 ((count ++)) done) & (count = 1000 trong khi [$ count -le 1099] làm echo "$ count" ngủ 1 ((count ++)) được thực hiện) & wait echo "Finished"

Sử dụng cho Subshells

Subshells rất hữu ích khi các lệnh cần được thực hiện trong một môi trường hoặc thư mục cụ thể. Nếu mỗi lệnh được thực hiện trong một vỏ khác, thì không có nguy cơ rằng các thiết lập biến sẽ bị trộn lẫn. Khi hoàn thành, các thiết lập và thư mục hiện tại không cần phải được phục hồi, vì môi trường của tiến trình cha mẹ không bị ảnh hưởng bởi bất kỳ quy trình con nào của nó.

Subshells có thể được sử dụng trong các định nghĩa hàm để chúng có thể được thực hiện nhiều lần với các tham số khác nhau.