157

一時ファイル用のシェルで一意のファイル名を取得する 1 つの方法は、2 つのドル記号 ( $$) を使用することであると読んだことがあります。これにより、時々変化する数値が生成されます...しかし、繰り返し呼び出すと、同じ数値が返されます。(解決策は、時間を使うことです。)

$$は、実際に何が何であるか、そして一意のファイル名を生成する方法として提案される理由を知りたいと思っています.

4

12 に答える 12

125

$$bash のプロセス ID (PID) です。通常、競合状態が発生し、シェルスクリプトが攻撃者によって破壊される可能性があるため、を使用$$することはお勧めできません。たとえば、安全でない一時ファイルを作成し、セキュリティ アドバイザリを発行しなければならなかったこれらすべての人々を参照してください。

代わりに、を使用してmktempください。mktempのLinux マニュアル ページは優れています。ここにいくつかのサンプルコードがあります:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
于 2008-09-17T00:13:43.507 に答える
112

コメントに記載されているように、 Bash$$はプロセス ID です。さまざまな理由から一時ファイル名として使用するのは安全ではありません。

一時ファイル名の場合は、mktempコマンドを使用します。

于 2008-09-17T00:02:13.923 に答える
23

$$ は現在のプロセスの ID です。

于 2008-09-17T00:01:48.480 に答える
8

UNIX のようなオペレーティング システムのすべてのプロセスには、(一時的に) 一意の識別子である PID があります。同時に実行される 2 つのプロセスは同じ PID を持つことはできず、$$ はスクリプトを実行する bash インスタンスの PID を参照します。

これは、再利用されることがないという意味で、一意の識別子ではありません (実際、PID は常に再利用されます)。それがあなたに与えるのは、他の人があなたのスクリプトを実行した場合、あなたのスクリプトがまだ実行されている間に別の識別子を取得するような数字です. あなたの PID が死ぬと、PID がリサイクルされ、他の誰かがあなたのスクリプトを実行して同じ PID を取得し、同じファイル名を取得する可能性があります。

そのため、「$$ は、私のインスタンスがまだ実行されているときに他の誰かが同じスクリプトを実行すると、別の名前が付けられるようなファイル名を与える」と言うのは本当に正気です。

于 2008-09-17T00:05:09.347 に答える
5

$$ はあなたの PID です。注意して、他の誰もまったく同じようにしない限り、一意のファイル名を実際に生成することはありません。

通常、 /tmp/myprogramname$$ のようなものを作成します

これを破る方法はたくさんあります。他の人が書き込める場所に書き込んでいる場合、多くの OS では、どの PID になるかを予測して失敗することはそれほど難しくありません。実行していると想像してください。 root として、/tmp/yourprogname13395 を /etc/passwd を指すシンボリック リンクとして作成し、そこに書き込みます。

これは、シェルスクリプトで行うのは悪いことです。何かのために一時ファイルを使用する場合は、少なくともファイルを開く (作成する) ための「排他的」フラグを追加できる、より優れた言語を使用する必要があります。そうすれば、他の何かを壊していないことを確認できます。

于 2008-09-17T00:06:00.420 に答える
4

$$ は、スクリプトを実行しているシェル インタープリターの pid (プロセス ID) です。現時点でシステムで実行されているプロセスごとに異なりますが、時間の経過とともに pid がラップアラウンドし、終了した後、最終的に同じ pid を持つ別のプロセスが存在します。実行している限り、pid は一意です。

上記の定義から、スクリプトで $$ を何度使用しても、同じ数値が返されることは明らかです。

たとえば、/tmp/myscript.scratch.$$ を一時ファイルとして使用して、信頼性や安全性をあまり高くする必要がない場合に使用できます。たとえば、trap コマンドを使用して、スクリプトの最後でそのような一時ファイルを削除することをお勧めします。

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
于 2008-09-17T00:08:20.430 に答える
3

$$ は、現在のシェル プロセスの pid です。一意のファイル名を生成するのは良い方法ではありません。

于 2008-09-17T00:01:50.540 に答える
2

$$ は、スクリプトが実行されているシェルのプロセス ID です。詳細については、sh または bash の man ページを参照してください。man ページは、コマンドライン「man sh」を使用するか、Web で「shell manpage」を検索して見つけることができます。

于 2008-09-17T00:05:11.857 に答える
2

bash プロセスのプロセス ID です。並行プロセスが同じ PID を持つことはありません。

于 2008-09-17T00:02:44.733 に答える
2

2番目のemkの答えを聞かせてください.$$を「一意の」ものとして単独で使用しないでください。ファイルの場合は、mktemp を使用します。同じ bash スクリプト内の他の ID については、「$$$(date +%s%N)」を使用して、一意性を確保します

 -k
于 2008-09-17T00:29:10.287 に答える