Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Trọng tâm chính của bài viết này là hiểu rõ điều gì sẽ xảy ra khi bạn chạy script vs source kịch bản trong bash. Trước tiên, chúng tôi sẽ hiểu rõ cách chương trình được gửi khi bạn gọi tập lệnh theo các cách khác nhau.

LƯU Ý :việc tạo tập lệnh với tiện ích mở rộng không thành vấn đề. Tập lệnh sẽ chạy tốt ngay cả khi không có phần mở rộng.

Về cơ bản, mọi tập lệnh đều bắt đầu bằng một dòng được gọi là shebang (#!) . Hash biểu tượng trong bash sẽ được hiểu là nhận xét nhưng shebang có một ý nghĩa đặc biệt. Nó yêu cầu bash gửi chương trình bằng bất kỳ trình thông dịch nào bạn đã đề cập trong shebang .

Dưới đây là một chương trình mẫu và tôi đang chỉ định bash làm thông dịch viên của mình.

$ cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

$ chmod +x Hello_world.sh

Bây giờ để chạy tập lệnh, bạn có thể thực hiện theo hai cách.

  • Sử dụng một đường dẫn tương đối để gọi tập lệnh. Di chuyển đến thư mục có tập lệnh và chạy ./Hello_world.sh .
  • Sử dụng đường dẫn tuyệt đối để gọi tập lệnh. Từ bất kỳ vị trí nào trong hệ thống tệp, hãy nhập đường dẫn đầy đủ đến tập lệnh.
$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Bây giờ, hãy xem điều gì sẽ xảy ra khi bạn cố gắng gửi chương trình của mình mà không có shebang . Không có shebang , chương trình sẽ được gửi đến bất kỳ trình bao hiện tại nào bạn đang chạy, Trong trường hợp của tôi, đó là Bash ( / bin / bash ).

Hãy để tôi chứng minh một ví dụ. Tôi đang tạo tập lệnh python mà không có shebang và khi tôi gọi chương trình, bash không biết rằng nó nên gửi chương trình này tới trình thông dịch python thay vì nó sẽ chạy chương trình trong trình bao hiện tại.

$ cat > run-py.py
echo $SHELL
print("Hello world")

$ chmod +x run-py.py
$ ./run-py.py
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Trong trường hợp này, bạn có thể gọi chương trình bằng cách đề cập đến trình thông dịch mà chương trình nên được gửi đến hoặc chỉ cần thêm shebang dòng luôn được khuyến nghị.

# which python3
$(which python3) /home/karthick/run_py.py
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Bây giờ bạn đã biết cách gọi tập lệnh, bước tiếp theo sẽ là hiểu điều gì xảy ra khi chúng ta gọi tập lệnh. Khi bạn gọi tập lệnh như được hiển thị trong các ví dụ trên, nó sẽ tạo ra một quy trình con ( forking ) và tập lệnh sẽ được gửi tới tiến trình con. Tôi đã chạy một tập lệnh mẫu sẽ chỉ chạy lệnh sau và cho thấy tập lệnh được gửi tới một quy trình con.

$ ps -ef --forest | grep -i bash
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Có thể có nhiều quy trình con như một phần của tập lệnh và điều đó phụ thuộc vào mã của chúng tôi. Cần lưu ý rằng các biến môi trường được tạo bởi chỉ số con sẽ bị loại bỏ khi nó hoàn thành. Một tiến trình con có thể truy cập các biến được tạo bởi tiến trình mẹ bằng cách xuất chúng. Nhưng quy trình mẹ không thể truy cập các biến được tạo bởi quy trình con.

Hãy xem các bài viết dưới đây để hiểu thêm về cách hoạt động của các biến và cách xuất các biến.

  • Hiểu và Viết 'Các biến Linux' trong Shell Scripting
  • Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Tìm nguồn cung cấp kịch bản

Nguồn ”Là một lệnh tích hợp trong trình bao đọc tệp được truyền dưới dạng đối số cho nó và chạy mã trong môi trường trình bao hiện tại. Một trường hợp sử dụng thích hợp mà bạn chủ yếu sử dụng là sửa đổi cấu hình của bạn trong .bashrc hoặc .bash_profile và tải lại các thay đổi bằng cách sử dụng lệnh nguồn .

$ type -a source
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Có hai cách cú pháp để chạy lệnh nguồn . Bạn có thể chọn bất kỳ ai từ hai cú pháp và đó là sự lựa chọn cá nhân.

$ source FILE_NAME [ARGUMENTS]
$ . FILE_NAME [ARGUMENTS]

Hãy để tôi chứng minh nguồn thực sự hoạt động như thế nào. Tôi sẽ tạo hai tập lệnh shell. Tập lệnh đầu tiên ( Module.sh ) sẽ chứa một số biến và hàm. Tập lệnh thứ hai ( Main.sh ) sẽ in biến và gọi hàm.

Tệp Module.sh .

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Tệp Main.sh .

#!/usr/bin/env bash

echo $VAR1
f1
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Đặt quyền thực thi cho tập lệnh và gọi tập lệnh chính “main.sh” . Bây giờ, tập lệnh này sẽ cố gắng tìm hàm f1 và biến VAR1 trong môi trường shell hiện tại và sẽ không thành công với lệnh không tìm thấy.

$ bash main.sh
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Bây giờ, hãy chạy lệnh nguồn bên trong tập lệnh, lệnh này sẽ tải biến và các hàm vào môi trường trình bao hiện tại và sẽ có thể truy cập được bằng “main.sh” .

Tệp Module.sh .

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Tệp Main.sh .

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Bây giờ hãy chạy lại script và xem.

$ bash main.sh
Tìm hiểu sự khác biệt giữa Tìm nguồn cung ứng và Forking in Bash

Nguồn rất hữu ích trong bash để làm theo cách tiếp cận lập trình mô-đun trong việc tạo các tập lệnh shell của chúng tôi. Chúng tôi có thể chia mã của mình thành các mô-đun nhỏ hơn và có thể được sử dụng trong nhiều chương trình. Theo những cách này, chúng ta có thể làm theo KHÔ ( Đừng lặp lại chính mình ) nguyên tắc.

Đó là nó cho bài viết này. Chúng tôi đã thảo luận ngắn gọn về sự khác biệt giữa tìm nguồn cung ứng và rèn trong bash. Xem qua bài viết và chia sẻ phản hồi có giá trị của bạn với chúng tôi.