Tôi đang đọc "Hướng dẫn bỏ túi BASH của Oreilly". Nó nói rằng:
ID tiến trình của quy trình Bash hiện tại. Trong một số trường hợp, điều này có thể khác với $$.
Trên giải thích, giải thích $BASHPID
biến.
Câu hỏi: trường hợp nào?
Tôi đang đọc "Hướng dẫn bỏ túi BASH của Oreilly". Nó nói rằng:
ID tiến trình của quy trình Bash hiện tại. Trong một số trường hợp, điều này có thể khác với $$.
Trên giải thích, giải thích $BASHPID
biến.
Câu hỏi: trường hợp nào?
Câu trả lời:
Một ví dụ được cung cấp trong phần BASHPID
mô tả của trang bash:
BASHPID
Expands to the process id of the current bash process. This
differs from $$ under certain circumstances, such as subshells
that do not require bash to be re-initialized.
Dưới đây là một ví dụ về một lớp con xuất ra nội dung của biến, cùng với $$
và nội dung BASHPID
bên ngoài của lớp con.
$ echo $(echo $BASHPID $$) $$ $BASHPID
25680 16920 16920 16920
# | | | |
# | | | -- $BASHPID outside of the subshell
# | | -- $$ outside of the subshell
# | -- $$ inside of the subshell
# -- $BASHPID inside of the subshell
Subshells. $$
được chỉ định bởi POSIX và luôn giữ nguyên giá trị của quy trình shell ban đầu. $BASHPID
là một biến đặc trưng của Bash và luôn là giá trị của quá trình mà biến đó được hủy đăng ký, đếm các chuỗi con.
$ f() { printf '%s: %d, %d\n' "$1" $$ $BASHPID; };
$ ${BASH_VERSION+shopt -s lastpipe}; set +m;
$ f 1 >&2 | f 2
2: 31490, 31490
1: 31490, 32545
Tôi đã cố gắng thuyết phục người bảo trì mksh để thêm BASHPID
vào phiên bản mới nhất, vì vậy nó có phần di động. Bạn cũng có thể tự thực hiện BASHPID
trong ksh93 trên nhiều nền tảng.
$BASHPID
mới đối với BASH 4. Nếu bạn đang sử dụng BASH 3.x, bạn phải sử dụng$$