it-swarm-vi.tech

$$ có nghĩa là gì trong vỏ?

Tôi đã từng đọc một cách để có được một tên tệp duy nhất trong Shell cho các tệp tạm thời là sử dụng ký hiệu đô la kép ($$). Điều này không tạo ra một số thay đổi theo thời gian ... nhưng nếu bạn gọi nó nhiều lần, nó sẽ trả về cùng một số. (Giải pháp là chỉ sử dụng thời gian.)

Tôi tò mò muốn biết $$ thực sự là gì và tại sao nó lại được đề xuất như một cách để tạo tên tệp duy nhất.

125
Kitty

Trong Bash $$ là ID tiến trình, như đã lưu ý trong các nhận xét, không an toàn khi sử dụng làm tên tệp tạm thời vì nhiều lý do.

Đối với tên tệp tạm thời, sử dụng lệnh mktemp.

85
Joe Skora

$$ là ID tiến trình (PID) trong bash. Sử dụng $$ là một ý tưởng tồi, bởi vì nó thường sẽ tạo ra một điều kiện chủng tộc và cho phép tập lệnh Shell của bạn bị kẻ tấn công lật đổ. Xem, ví dụ, tất cả những người này người đã tạo các tệp tạm thời không an toàn và phải đưa ra các lời khuyên bảo mật.

Thay vào đó, hãy sử dụng mktemp. Trang Linux man cho mktemp là tuyệt vời. Dưới đây là một số mã ví dụ từ nó:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
102
emk

$$ là id của quy trình hiện tại.

17
Flint

Mỗi tiến trình trong một hệ điều hành giống như UNIX đều có một định danh duy nhất (tạm thời) là PID. Không có hai tiến trình nào chạy cùng một lúc có thể có cùng một PID và $$ đề cập đến PID của đối tượng bash đang chạy tập lệnh.

Đây là rất nhiều không một trình xác thực duy nhất theo nghĩa là nó sẽ không bao giờ được sử dụng lại (thực sự, các PID được sử dụng lại liên tục). Những gì nó cung cấp cho bạn là một con số sao cho, nếu người khác chạy tập lệnh của bạn, họ sẽ nhận được một mã định danh khác trong khi của bạn vẫn đang chạy. Khi máy của bạn chết, PID có thể được tái chế và người khác có thể chạy tập lệnh của bạn, nhận cùng một bộ mã hóa và do đó có cùng tên tệp.

Như vậy, chỉ thực sự lành mạnh khi nói "$$ đưa ra một tên tệp sao cho nếu ai đó chạy cùng một kịch bản mà ví dụ của tôi vẫn đang chạy, họ sẽ nhận được một tên khác".

6
Adam Wright

$$ là PID của bạn. Nó không thực sự tạo ra một tên tệp duy nhất, trừ khi bạn cẩn thận và không ai khác thực hiện chính xác như vậy. 

Thông thường, bạn sẽ tạo một cái gì đó như/tmp/myprogramname $$

Có rất nhiều cách để phá vỡ điều này và nếu bạn viết thư đến các địa điểm thì những người khác có thể viết thư cho nó không quá khó đối với nhiều hệ điều hành để dự đoán bạn sẽ có những gì mà bạn sẽ có là root và tôi tạo/tmp/yourprogname13395 dưới dạng một liên kết tượng trưng trỏ đến/etc/passwd - và bạn viết vào đó.

Đây là một điều xấu khi làm trong kịch bản Shell. Nếu bạn sẽ sử dụng một tệp tạm thời cho một cái gì đó, bạn nên sử dụng một ngôn ngữ tốt hơn ít nhất sẽ cho phép bạn thêm cờ "độc quyền" để mở (tạo) tệp. Sau đó, bạn có thể chắc chắn rằng bạn không ghi đè lên một cái gì đó khác.

4
JBB

Hãy để tôi trả lời câu hỏi thứ hai của emk - đừng sử dụng $$ như một thứ "độc nhất". Đối với các tập tin, sử dụng mktemp. Đối với các ID khác trong cùng tập lệnh bash, hãy sử dụng "$$$ (ngày +% s% N)" cho một cách hợp lý cơ hội tốt về tính duy nhất.

 -k
2
Kevin Little

$$ là mấu chốt của quy trình Shell hiện tại. Đó không phải là một cách tốt để tạo tên tệp duy nhất.

2
leif

$$ là id tiến trình của Shell trong đó tập lệnh của bạn đang chạy. Để biết thêm chi tiết, xem trang man cho sh hoặc bash. Các trang man có thể được tìm thấy bằng cách sử dụng dòng lệnh "man sh" hoặc bằng cách tìm kiếm trên web cho "Shell manpage"

2
Shannon Nelson

Đó là ID tiến trình của quy trình bash. Không có quy trình đồng thời sẽ có cùng một PID.

1
Chris

$$ là pid (process id) của trình thông dịch Shell chạy tập lệnh của bạn. Hiện tại, mỗi lần chạy trên một hệ thống đều khác nhau, nhưng theo thời gian, pid sẽ kết thúc và sau khi bạn thoát, sẽ có một quy trình khác với cùng một pid.

Từ định nghĩa ở trên, rõ ràng là cho dù bạn sử dụng $$ bao nhiêu lần trong một tập lệnh, nó sẽ trả về cùng một số. 

Bạn có thể sử dụng, ví dụ: /tmp/myscript.scratch.$$ là tệp tạm thời của bạn cho những thứ không cần phải cực kỳ đáng tin cậy hoặc an toàn. Đó là một cách thực hành tốt để xóa các tệp tạm thời như vậy ở cuối tập lệnh của bạn, ví dụ: sử dụng lệnh bẫy:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
1
Arkadiy

Ngoài ra, bạn có thể lấy tên người dùng đăng nhập thông qua lệnh này. Ví dụ.

echo $(</proc/$$/login id). After that, you need to use getent command.
0
Obivan