it-swarm-tr.com

Kabukta $$ ne anlama geliyor?

Bir keresinde, geçici dosyalar için bir Kabuk'ta benzersiz bir dosya adı elde etmenin bir yolunun çift dolar işareti ($$) kullanmak olduğunu okudum. Bu zaman zaman değişen bir sayı üretir ... ama tekrar tekrar çağırırsanız, aynı sayıyı döndürür. (Çözüm sadece zamanı kullanmaktır.)

$$ öğesinin gerçekte ne olduğunu ve neden benzersiz dosya adları oluşturmanın bir yolu olarak önerileceğini bilmek istiyorum.

125
Kitty

Bash $$, işlem kimliğidir, yorumlarda belirtildiği gibi, çeşitli nedenlerle geçici dosya adı olarak kullanmak güvenli değildir.

Geçici dosya adları için mktemp komutunu kullanın.

85
Joe Skora

$$, bash içindeki işlem kimliğidir (PID). $$ kullanmak kötü bir fikirdir, çünkü genellikle bir yarış koşulu yaratacaktır ve Shell betiğinizin bir saldırgan tarafından altüst edilmesine izin verecektir. Örneğin, güvensiz geçici dosyalar oluşturan ve güvenlikle ilgili danışmanlık veren tüm bu insanlar öğelerine bakın.

Bunun yerine, mktemp öğesini kullanın. Mktemp için Linux kılavuz sayfası mükemmeldir. İşte ondan bazı örnek kodlar:

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

$$, mevcut sürecin kimliğidir.

17
Flint

UNIX benzeri bir işletim sistemindeki her işlem (geçici olarak) benzersiz bir tanımlayıcıya (PID) sahiptir. Aynı anda çalışan iki işlem aynı PID'ye sahip olamaz ve $$, betiği çalıştıran bash örneğinin PID'sini belirtir.

Bu çok fazla değil asla tekrar kullanılmayacağı anlamında eşsiz bir tanımlayıcıdır (gerçekten, PID'ler sürekli olarak yeniden kullanılır). Size verdiği şey, başka bir kişi betiğinizi çalıştırırsa, sizinkini çalıştırırken farklı bir tanımlayıcıya sahip olacakları bir sayıdır. Sizinki öldüğünde, PID geri dönüştürülebilir ve başka biri komut dosyanızı çalıştırabilir, aynı PID'yi alabilir ve böylece aynı dosya adını alabilirsiniz.

Bu nedenle, yalnızca "$$ bir dosya adı verir; böylece benim örneğim hala çalışıyorken başka bir betiği çalıştırırsa, farklı bir ad alırlar" demek çok akıllıca olur.

6
Adam Wright

$$, PID'iniz. Dikkatli olmadıkça ve hiç kimse aynı şekilde yapmazsa, gerçekten benzersiz bir dosya adı oluşturmaz. 

Genelde/tmp/myprogramname $$ gibi bir şey yaratırsınız

Bunu kırmanın pek çok yolu var ve eğer başkalarının yazabileceği yerlere yazarsanız, birçok işletim sisteminde hangi PID'ye sahip olacağınızı tahmin edip onları mahvedeceğinizi tahmin etmek çok zor değil. root olarak ve/tmp/yourprogname13395 'i/etc/passwd' a işaret eden bir link olarak - ve sen de içine yaz.

Bu bir Shell betiğinde yapılması kötü bir şey. Bir şey için geçici bir dosya kullanacaksanız, en azından dosyayı açmak (oluşturmak) için "özel" bayrağını eklemenize izin verecek daha iyi bir dil kullanıyor olmalısınız. O zaman başka bir şeyi gizlememediğinden emin olabilirsin.

4
JBB

İkinci emk'in cevabını vereyim - $$ 'i benzersiz bir şey olarak kullanmayın. Dosyalar için mktemp kullanın. Aynı bash betiğindeki diğer kimlikler için, uygun - benzersiz olma şansı için "$$$ (date +% s% N)" kullanın.

 -k
2
Kevin Little

$$, mevcut Shell işleminin pid'idir. Benzersiz dosya isimleri oluşturmak için iyi bir yol değil.

2
leif

$$, betiğinizin çalıştığı Shell'in işlem kimliğidir. Daha fazla ayrıntı için, sh veya bash için man sayfasına bakın. Man sayfaları, "man sh" komut satırı kullanılarak veya webde "Shell manpage" aranarak bulunabilir.

2
Shannon Nelson

Bash işleminin işlem kimliği. Hiçbir eşzamanlı süreç hiçbir zaman aynı PID'ye sahip olmayacaktır.

1
Chris

$$, betiğinizi çalıştıran Shell tercümanının pid'idir (işlem kimliği). Şu anda bir sistemde çalışan her işlem için farklıdır, ancak zamanla pid sarılır ve çıktıktan sonra aynı pid ile sonuçlanan başka bir işlem olacaktır.

Yukarıdaki tanımdan, bir betişte $$'i kaç kez kullanırsanız kullanın, aynı sayıyı döndüreceği açıktır. 

Örneğin kullanabilirsiniz. /tmp/myscript.scratch.$$, son derece güvenilir veya güvenli olması gerekmeyen şeyler için geçici dosyanızdır. Bu geçici dosyaları komut dosyanızın sonunda, örneğin trap komutunu kullanarak silmek iyi bir uygulamadır:

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

Ayrıca, bu komutla giriş kullanıcı adınızı alabilirsiniz. Örneğin.

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