一時ファイルのシェルで一意のファイル名を取得する1つの方法は、二重ドル記号($$
)。これは、時々変化する数字を生成します...しかし、繰り返し呼び出した場合、同じ数字を返します。 (解決策は、時間を使用することです。)
$$
は実際に、そしてそれが一意のファイル名を生成する方法として提案される理由です。
Bashで$$
はプロセスIDであり、さまざまな理由で一時ファイル名として使用するのは安全ではないというコメントに記載されているとおりです。
一時ファイル名には、mktemp
コマンドを使用します。
$$
は、bashのプロセスID(PID)です。 $$
を使用することは、通常は競合状態を引き起こし、シェルスクリプトが攻撃者によって破壊される可能性があるため、悪いアイデアです。たとえば、安全でない一時ファイルを作成し、セキュリティアドバイザリを発行する必要があったすべての これらの人々 を参照してください。
代わりに、mktemp
を使用します。 mktempのLinux manページ は優れています。以下にいくつかのサンプルコードを示します。
tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
$$は現在のプロセスのIDです。
オペレーティングシステムのようなUNIXのすべてのプロセスには、(一時的に)一意の識別子、PIDがあります。同時に実行されている2つのプロセスが同じPIDを持つことはできません。また、$$は、スクリプトを実行しているbashインスタンスのPIDを指します。
これは非常に多くnot再利用されないという意味で一意の識別子です(実際、PIDは常に再利用されます)。それがあなたに与えるものは、他の人があなたのスクリプトを実行した場合、あなたがまだ実行している間に彼らが異なる識別子を取得するような数です。あなたが死ぬと、PIDはリサイクルされ、他の誰かがあなたのスクリプトを実行し、同じPIDを取得し、同じファイル名を取得するかもしれません。
そのため、「$$は、他の誰かが同じスクリプトを実行している場合、私のインスタンスがまだ実行されている場合、別の名前が付けられるようにファイル名を与える」と言うのは本当に正気です。
$$はPIDです。あなたが注意し、他の誰もまったく同じ方法でそれをしない限り、それは実際に一意のファイル名を生成しません。
通常、/ tmp/myprogramname $$のようなものを作成します
これを破る方法はたくさんあり、他の人が書くことができる場所に書いている場合、多くのOSであなたが持っているPIDを予測してねじ回すことはそれほど難しいことではありません-あなたが走っていると想像してくださいrootとして、/ etc/passwdを指すシンボリックリンクとして/ tmp/yourprogname13395を作成し、それに書き込みます。
これは、シェルスクリプトで行うのは悪いことです。一時ファイルを何かに使用する場合は、少なくともファイルを開く(作成する)ための「排他的」フラグを追加できる、より優れた言語を使用する必要があります。そうすれば、他の何かを壊していないことを確認できます。
2番目のemkの答えを教えてください。$$を単独で「ユニークな」ものとして使用しないでください。ファイルの場合は、mktempを使用します。同じbashスクリプト内の他のIDの場合、合理的に一意性の可能性に「$$$(date +%s%N)」を使用します。
-k
$$は、現在のシェルプロセスのPIDです。一意のファイル名を生成するのは良い方法ではありません。
$$は、スクリプトが実行されているシェルのプロセスIDです。詳細については、shまたはbashのマニュアルページを参照してください。マニュアルページは、コマンドライン「man sh」を使用するか、Webで「Shell manpage」を検索することで見つけることができます。
これは、bashプロセスのプロセスIDです。同時プロセスが同じPIDを持つことはありません。
$$は、スクリプトを実行しているシェルインタープリターのpid(プロセスID)です。現時点でシステム上で実行されているプロセスごとに異なりますが、時間の経過とともにpidはラップアラウンドし、終了すると、最終的に同じpidを持つ別のプロセスが存在します。実行している限り、pidは一意です。
上記の定義から、スクリプトで$$を何度使用しても、同じ数が返されることは明らかです。
次を使用できます。 /tmp/myscript.scratch.$$は、非常に信頼性が高く安全である必要のないものの一時ファイルとして使用します。たとえば、trapコマンドを使用して、スクリプトの最後にそのような一時ファイルを削除することをお勧めします。
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
また、このコマンドを使用してログインユーザー名を取得できます。例えば。
echo $(</proc/$$/login id). After that, you need to use getent command.