回答:
$$
コメントで述べたように、BashにはプロセスIDがあり、さまざまな理由で一時ファイル名として使用するのは安全ではありません。
一時ファイル名については、mktemp
コマンドを使用します。
$$
bashのプロセスID(PID)です。$$
通常、競合状態が発生し、攻撃者がシェルスクリプトを破壊できるため、使用はお勧めできません。たとえば、安全でない一時ファイルを作成し、セキュリティ勧告を発行しなければならなかったこれらすべての人々を見てください。
代わりに、を使用してくださいmktemp
。mktempのLinuxマニュアルページは優れています。これからのサンプルコードは次のとおりです。
tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
mktemp
オプション-t
は廃止されました(charに問題があるためと思います-
)。これらの日を使用してくださいmktemp ${tempfoo}.XXXXXX
。私は自由にあなたの投稿を更新します。
TMPFILE=$(mktemp)
代わりに使用してください。
UNIXのようなオペレーティングシステムのすべてのプロセスには、(一時的に)一意の識別子であるPIDがあります。同時に実行されている2つのプロセスが同じPIDを持つことはできません。$$は、スクリプトを実行しているbashインスタンスのPIDを参照します。
これは非常に多くありませんそれは(実際に、PIDは常に再利用されます)再利用されることはありませんという意味でユニークidenifier。それがあなたに与えるのは、他の人があなたのスクリプトを実行した場合、あなたのスクリプトがまだ実行されている間に彼らが別の識別子を取得するような数です。いったん死ぬと、PIDがリサイクルされ、他の誰かがスクリプトを実行して同じPIDを取得し、同じファイル名を取得する可能性があります。
そのため、「$$がファイル名を与えるので、インスタンスがまだ実行されているときに誰かが同じスクリプトを実行すると、別の名前が付けられます」と言うのは本当に正気です。
$$はPIDです。あなたが注意して他の誰もそれをまったく同じ方法で行わない限り、それは実際にユニークなファイル名を生成しません。
通常、/ tmp / myprogramname $$のようなものを作成します
これを破る方法はたくさんあります。他の人が書き込める場所に書き込んでいる場合、多くのOSでは、どのPIDを持っているかを予測してねじ込むのはそれほど難しいことではありません。 rootとして、/ etc / passwdを指すシンボリックリンクとして/ tmp / yourprogname13395を作成します-そして、あなたはそれに書き込みます。
これは、シェルスクリプトで行うには悪いことです。何かのために一時ファイルを使用する場合、少なくともファイルを開く(作成する)ための「排他的」フラグを追加できる、より優れた言語を使用する必要があります。そうすれば、他のものを壊していないことを確認できます。
$$は、スクリプトを実行しているシェルインタープリターのpid(プロセスID)です。現時点ではシステム上で実行されているプロセスごとに異なりますが、時間の経過とともにpidが循環し、終了すると、同じpidを持つ別のプロセスが最終的に存在します。実行している限り、pidはあなたに固有です。
上記の定義から、スクリプトで$$を何度使用しても同じ数が返されることは明らかです。
たとえば、/ tmp / myscript.scratch。$$を、非常に信頼性や安全性を必要としないものの一時ファイルとして使用できます。たとえば、trapコマンドを使用して、スクリプトの最後でそのような一時ファイルを削除することをお勧めします。
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
これは、bashプロセスのプロセスIDです。並行プロセスが同じPIDを持つことはありません。