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 $$ và $ BASHPID trong Bash

Gần đây, tôi đang làm việc trên một tập lệnh shell và tôi thấy sự khác biệt đáng kể về cách bash biến đặc biệt $BASHPID cư xử. Mọi quy trình chạy trong Linux sẽ được gán với một quy trình ID và đó là cách hệ điều hành xử lý quá trình.

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

Tương tự, phiên đầu cuối bash của bạn cũng sẽ được chỉ định với một ID quy trình. Có một biến đặc biệt được gọi là "$""$BASHPID" nơi lưu trữ ID tiến trình của trình bao hiện tại.

Hãy tiếp tục và chạy lệnh dưới đây để xem ID tiến trình của trình bao hiện tại của bạn là gì. Cả "$""$BASHPID" sẽ trả về cùng một giá trị.

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Trong bash khi chúng ta gọi bất kỳ chương trình bên ngoài nào từ shell, nó sẽ tạo ra một process con / subshell và chương trình sẽ chỉ được gửi trong process con. Xem ví dụ dưới đây, nơi tôi đặt một lệnh giám sát quy trình đơn giản trong tập lệnh có tên “sample.sh” để chứng minh cách shell cha tạo ra một vỏ con để chạy chương trình.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Bây giờ khi chạy tập lệnh này, chúng ta có thể nhận được ID tiến trình của bash. Từ hình ảnh bên dưới, bạn có thể hiểu khi tôi gọi script bash tạo một process con và chạy script.

$ ./sample.sh
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Bây giờ chúng ta hãy sử dụng cả "$""$BASHPID" bên trong tập lệnh và xem những gì nó trả về.

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

Bây giờ hãy chạy lại tập lệnh.

$ ./sample.sh
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Được rồi, nó trả về cùng một ID quy trình. Đây là sự khác biệt thực tế. Hãy tạo một quy trình con khác bên trong tập lệnh bằng cách chạy một lệnh bên trong parentheses() .

# STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Trong dấu ngoặc đơn, Dấu ngoặc đơn sẽ gọi một tiến trình con và chạy bất cứ thứ gì bên trong dấu ngoặc đơn. Trong trường hợp đó, cả $$BASHPID nên lưu trữ một ID quy trình con mới. Nhưng từ hình ảnh trên, bạn có thể thấy có sự khác biệt ở chỗ $ cửa hàng 382 là ID gốc (ID quy trình của tập lệnh sample.sh ) và $BASHPID lưu trữ ID quy trình con đã tạo được tạo bằng dấu ngoặc đơn.

Bây giờ chúng ta hãy cố gắng hiểu hành vi này. Chúng ta sẽ xem trang người đàn ông nói gì.

$ man bash
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Khi bạn sử dụng $ , ngay cả trong một vỏ con, nó lưu trữ ID tiến trình của tiến trình mẹ mà nó được tạo từ đó. Nhưng BASHPID sẽ lưu trữ ID quy trình hiện tại, tức là khi được gọi bên trong dấu ngoặc đơn, nó sẽ lưu trữ ID quy trình con.

Chúng tôi không thể chỉ định hoặc sửa đổi biến $ , nhưng BASHPID có thể được chỉ định lại nhưng nó không có hiệu lực.

$ $=10
$ BASHPID=10
$ echo $BASHPID
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Có thể bỏ đặt BASHPID . Khi bạn bỏ thiết lập, nó sẽ mất trạng thái đặc biệt và bạn cũng có thể bắt đầu sử dụng biến này như một biến bình thường.

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Ngay cả khi bạn cố gắng gán ID tiến trình của shell, nó sẽ được coi là một biến do người dùng xác định vì nó đã mất trạng thái đặc biệt.

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID
Tìm hiểu sự khác biệt giữa $$ và $ BASHPID trong Bash

Trong trường hợp này, bạn phải sử dụng phiên đầu cuối mới cho BASHPID để có được trạng thái đặc biệt của nó.

Đó là nó cho bài viết này. Chúng tôi đã thấy sự khác biệt giữa $BASHPID và cách họ cư xử trong bài viết này. Xem qua bài viết này và chia sẻ phản hồi có giá trị của bạn với chúng tôi.