Theo câu trả lời của @Gilles mà tôi gặp phải trong khi giải quyết một vấn đề khác mà tôi gặp phải, tôi đã cùng nhau đưa ra một chương trình kiểm tra nhanh, củng cố lý thuyết rằng câu trả lời đúng là:
MYPID=$(exec sh -c 'echo $PPID')
Tôi đã tìm thấy đôi khi exec
không cần thiết nhưng tôi đã xác nhận rằng sử dụng nó là cách duy nhất để có được chính xác tất cả thời gian trong tất cả các vỏ tôi đã thử. Đây là bài kiểm tra của tôi:
#!/bin/sh
pids() {
echo ------
pstree -pg $PPID
echo 'PPID = ' $PPID
echo '$$ = ' $$
echo 'BASHPID =' $BASHPID
echo -n 'sh -c echo $PPID = '; sh -c 'echo $PPID'
echo -n '$(sh -c '\''echo $PPID'\'') = '; echo $(sh -c 'echo $PPID')
echo -n '$(exec sh -c '\''echo $PPID'\'') = '; echo $(exec sh -c 'echo $PPID')
echo -n 'p=$(sh -c '\''echo $PPID'\'') = '; p=$(sh -c 'echo $PPID') ; echo $p
echo -n 'p=$(exec sh -c '\''echo $PPID'\'') = '; p=$(exec sh -c 'echo $PPID') ; echo $p
}
pids
pids | cat
echo -e "$(pids)"
và đầu ra của nó
------
bash(5975,5975)---pidtest(13474,13474)---pstree(13475,13474)
PPID = 5975
$$ = 13474
BASHPID = 13474
sh -c echo $PPID = 13474
$(sh -c 'echo $PPID') = 13474
$(exec sh -c 'echo $PPID') = 13474
p=$(sh -c 'echo $PPID') = 13474
p=$(exec sh -c 'echo $PPID') = 13474
------
bash(5975,5975)---pidtest(13474,13474)-+-cat(13482,13474)
`-pidtest(13481,13474)---pstree(13483,13474)
PPID = 5975
$$ = 13474
BASHPID = 13481
sh -c echo $PPID = 13481
$(sh -c 'echo $PPID') = 13481
$(exec sh -c 'echo $PPID') = 13481
p=$(sh -c 'echo $PPID') = 13481
p=$(exec sh -c 'echo $PPID') = 13481
------
bash(5975,5975)---pidtest(13474,13474)---pidtest(13489,13474)---pstree(13490,13474)
PPID = 5975
$$ = 13474
BASHPID = 13489
sh -c echo $PPID = 13489
$(sh -c 'echo $PPID') = 13492
$(exec sh -c 'echo $PPID') = 13489
p=$(sh -c 'echo $PPID') = 13495
p=$(exec sh -c 'echo $PPID') = 13489
Thay vỏ ưa thích của bạn trong công việc: sh
, bash
, mksh
, ksh
, vv ...
Tôi không hiểu tại sao trường hợp 2 và 3 cho kết quả khác nhau, cũng như tại sao kết quả cho trường hợp 3 khác nhau giữa các vỏ. Tôi đã cố gắng bash
, ksh
và mksh
trên Arch Linux FWIW.