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 $
và 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.
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à "$"
và "$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ả "$"
và "$BASHPID"
sẽ trả về cùng một giá trị.
$ echo $$ # Printing special variable $ $ echo $BASHPID # Printing the varibale $BASHPID
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
Bây giờ chúng ta hãy sử dụng cả "$"
và "$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
Đượ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"
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ả $
và $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
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
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
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
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 $
và 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.