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 itu, dan mengapa itu akan disarankan sebagai cara untuk menghasilkan nama file yang unik.
$$
adalah ID proses (PID) dalam bash. Menggunakan$$
adalah ide yang buruk, karena biasanya akan menciptakan kondisi balapan, dan memungkinkan skrip shell Anda untuk ditumbangkan oleh penyerang. Lihat, misalnya, semua orang ini yang membuat file sementara tidak aman dan harus mengeluarkan nasihat keamanan.Sebaliknya, gunakan
mktemp
. The halaman manual Linux untuk mktemp sangat baik. Berikut beberapa contoh kode dari itu:sumber
mktemp
pilihan-t
sekarang tidak berlaku (saya pikir karena masalah dengan char-
). Gunakanmktemp ${tempfoo}.XXXXXX
hari ini . Saya mengambil kebebasan untuk memperbarui posting Anda.TMPFILE=$(mktemp)
saja.$$ adalah id dari proses saat ini.
sumber
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 $$ merujuk ke PID dari instance bash yang menjalankan skrip.
Ini sangat tidak pengenal unik dalam arti bahwa itu tidak akan pernah digunakan kembali (memang, PID digunakan kembali 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".
sumber
$$ 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.
sumber
$$ adalah pid dari proses shell saat ini. Itu bukan cara yang baik untuk menghasilkan nama file yang unik.
sumber
$$ adalah pid (id proses) dari shell interpreter yang menjalankan skrip Anda. Ini berbeda untuk setiap proses yang berjalan pada suatu sistem saat ini, tetapi seiring waktu pid tersebut membungkus, 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, misalnya /tmp/myscript.scratch.$$ sebagai file temp Anda untuk hal-hal yang tidak perlu terlalu dapat diandalkan atau aman. Merupakan praktik yang baik untuk menghapus file temp semacam itu di akhir skrip Anda, menggunakan, misalnya, perintah trap:
sumber
Ini adalah ID proses dari proses bash. Tidak ada proses bersamaan yang akan memiliki PID yang sama.
sumber
$$ adalah id proses dari shell di mana 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 untuk "shell manpage"
sumber
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 peluang keunikan yang cukup baik.
sumber
sumber