it-swarm-id.com

Apa maksud $$ di dalam shell?

Saya pernah membaca bahwa salah satu cara untuk mendapatkan nama file unik di Shell untuk file temp adalah dengan menggunakan tanda dolar ganda ($$). Ini memang menghasilkan angka yang bervariasi dari waktu ke waktu ... tetapi jika Anda memanggilnya berulang kali, ia mengembalikan nomor yang sama. (Solusinya adalah dengan menggunakan waktu saja.)

Saya ingin tahu apa sebenarnya $$ sebenarnya, dan mengapa ini disarankan sebagai cara untuk menghasilkan nama file yang unik.

125
Kitty

Dalam Bash $$ adalah ID proses, seperti yang tercantum dalam komentar itu tidak aman untuk digunakan sebagai nama file temp karena berbagai alasan.

Untuk nama file sementara, gunakan perintah mktemp.

85
Joe Skora

$$ adalah ID proses (PID) dalam bash. Menggunakan $$ adalah ide yang buruk, karena biasanya akan menciptakan kondisi balapan, dan memungkinkan skrip Shell Anda ditumbangkan oleh penyerang. Lihat, misalnya, semua orang-orang ini yang membuat file sementara tidak aman dan harus mengeluarkan nasihat keamanan.

Sebagai gantinya, gunakan mktemp. Halaman manual Linux untuk mktemp sangat bagus. Berikut beberapa contoh kode dari itu:

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

$$ adalah id dari proses saat ini.

17
Flint

Setiap proses dalam sistem operasi mirip UNIX memiliki (sementara) pengidentifikasi unik, PID. Tidak ada dua proses yang berjalan pada saat yang sama dapat memiliki PID yang sama, dan $$ mengacu pada PID dari instance bash yang menjalankan skrip.

Ini sangat bukan pengenal unik dalam arti bahwa itu tidak akan pernah digunakan kembali (memang, PID digunakan terus-menerus). Apa yang diberikannya adalah angka sehingga, jika orang lain menjalankan skrip Anda, mereka akan mendapatkan pengenal yang berbeda saat milik Anda masih berjalan. Setelah milik Anda mati, PID dapat didaur ulang dan orang lain dapat menjalankan skrip Anda, dapatkan PID yang sama, dan dapatkan nama file yang sama.

Dengan demikian, itu hanya benar-benar waras untuk mengatakan "$$ memberikan nama file sehingga jika orang lain menjalankan skrip yang sama ketika contoh saya masih berjalan, mereka akan mendapatkan nama yang berbeda".

6
Adam Wright

$$ adalah PID Anda. Itu tidak benar-benar menghasilkan nama file yang unik, kecuali Anda berhati-hati dan tidak ada orang lain yang melakukannya dengan cara yang persis sama. 

Biasanya Anda akan membuat sesuatu seperti/tmp/myprogramname $$

Ada begitu banyak cara untuk memecahkan ini, dan jika Anda menulis ke lokasi orang lain dapat menulis untuk itu tidak terlalu sulit pada banyak OS untuk memprediksi PID apa yang akan Anda miliki dan mainkan - bayangkan Anda menjalankan sebagai root dan saya membuat/tmp/yourprogname13395 sebagai symlink yang menunjuk ke/etc/passwd - dan Anda menulis di dalamnya.

Ini adalah hal yang buruk untuk dilakukan dalam skrip Shell. Jika Anda akan menggunakan file sementara untuk sesuatu, Anda harus menggunakan bahasa yang lebih baik yang setidaknya akan membiarkan Anda menambahkan bendera "eksklusif" untuk membuka (membuat) file. Maka Anda dapat yakin bahwa Anda tidak mengalahkan sesuatu yang lain.

4
JBB

Biarkan saya menjawab kedua emk - jangan gunakan $$ dengan sendirinya sebagai sesuatu yang "unik". Untuk file, gunakan mktemp. Untuk ID lain dalam skrip bash yang sama, gunakan "$$$ (tanggal +% s% N)" untuk cukup peluang bagus untuk keunikan.

 -k
2
Kevin Little

$$ adalah pid dari proses Shell saat ini. Itu bukan cara yang baik untuk menghasilkan nama file yang unik.

2
leif

$$ adalah id proses Shell tempat skrip Anda berjalan. Untuk detail lebih lanjut, lihat halaman manual untuk sh atau bash. Halaman manual dapat ditemukan menggunakan baris perintah "man sh", atau dengan mencari di web "Shell manpage"

2
Shannon Nelson

Ini adalah ID proses dari proses bash. Tidak ada proses konkuren yang akan memiliki PID yang sama.

1
Chris

$$ adalah pid (id proses) dari penerjemah Shell yang menjalankan skrip Anda. Ini berbeda untuk setiap proses yang berjalan pada suatu sistem saat ini, tetapi seiring waktu pid tersebut membungkusnya, dan setelah Anda keluar akan ada proses lain dengan pid yang sama pada akhirnya. Selama Anda menjalankan, pid itu unik untuk Anda.

Dari definisi di atas harus jelas bahwa tidak peduli berapa kali Anda menggunakan $$ dalam sebuah skrip, itu akan mengembalikan angka yang sama. 

Anda dapat menggunakan, mis. /tmp/myscript.scratch.$$ sebagai file temp Anda untuk hal-hal yang tidak perlu terlalu dapat diandalkan atau aman. Ini adalah praktik yang baik untuk menghapus file temp tersebut di akhir skrip Anda, menggunakan, misalnya, perintah trap:

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

Anda juga dapat mengambil nama pengguna login melalui perintah ini. Misalnya.

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