$ BASHPID và $$ khác nhau trong một số trường hợp


10

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 $BASHPIDbiến.

Câu hỏi: trường hợp nào?


1
Cần lưu ý rằng $BASHPIDmới đối với BASH 4. Nếu bạn đang sử dụng BASH 3.x, bạn phải sử dụng$$
Bruno Bronosky

Câu trả lời:


19

Một ví dụ được cung cấp trong phần BASHPIDmô 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 BASHPIDbê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

14

Subshells. $$được chỉ định bởi POSIX và luôn giữ nguyên giá trị của quy trình shell ban đầu. $BASHPIDlà 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 BASHPIDvà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 BASHPIDtrong ksh93 trên nhiều nền tảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.