web-dev-qa-db-ja.com

mktemp -dまたはmkdirで作成されたディレクトリ間にプログラム上の違いはありますか?

Stephen Kittの answer が、次のコードで一時ディレクトリを作成したこの質問を理解しようとしています。

#!/bin/bash

scripttmp=$(mktemp -d) # Create a temporary directory (these will usually be created under /tmp or /var/tmp/)

このコマンドを実行するたびに、/tmp/の下に作成された新しい一時ディレクトリが表示されます(Roaimaの回答を読むまでそこに表示されるとは知りませんでした ここ ):

IIUCでは、通常のディレクトリと一時ディレクトリの間にプログラム上の違いはありません(唯一の違いは、各ディレクトリがマシンにとどまる時間による、これらのディレクトリの使用方法です)。

プログラム上の違いがない場合、より最小限のmkdirよりもmktemp -dを好むのはなぜですか?

1
user149572

mkdirを使用する場合、スクリプトは、まだ存在していない名前のディレクトリを作成することを確認する必要があります。 dirnameが現在のディレクトリに存在する名前である場合、mkdir dirnameを使用するとエラーになります。

一時ディレクトリ(つまり、現在のスクリプトの存続期間よりも長く必要とされないディレクトリ)を作成する場合、ディレクトリの名前は一般的に重要ではなく、mktemp -dはまだ使用されていない名前を見つけます。他の何かによって。

mktemp -dを使用すると、一時ディレクトリを簡単かつ安全に作成できます。 mktemp -dがないと、成功するまで複数の名前でmkdirを試行する必要があります。これは不必要に複雑であり、間違って実行される可能性があります(コードに微妙な競合状態が発生する可能性があります)。

mktempはまた、スクリプトのユーザーに、一時ディレクトリを作成する場所を少し制御できるようにします。たとえば、スクリプトがそのディレクトリに格納する必要のある大量の一時データを生成する場合、ユーザーはTMPDIR環境変数(スクリプトを呼び出す前または呼び出すときに)を設定して、十分なスペースが利用可能なパーティション上の書き込み可能なディレクトリ。 mktemp -dは、そのパスの下に一時ディレクトリを作成します。

TMPDIRが設定されていない場合、mktempは代わりに/tmpを使用します。

6
Kusalananda

_mktemp -d_はランダムな名前で一時ディレクトリを作成するため、次のようになります。厳密な一時ディレクトリ削除ポリシーがある場合は、使用後にディレクトリを削除することを忘れないでください。

これが、値を保持するためにscripttmp=$(mktemp -d)を記述した理由です。一般的には使いやすいです。

気にしない限り、この小さな例を使用してランダムな名前を生成し、後でフォルダーを削除できます。

_var=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);
mkdir "/tmp/$var"
#some code
rm -rf "/tmp/$var"
_

Mktemp -dまたはmkdirで作成されたディレクトリ間にプログラム上の違いはありますか?

あります。 mkdirを使用してディレクトリ名を生成し、_mktemp -d_を使用すると、システムは_/dev/urandom_ gettimeofdaygetpid 、.に基づいてディレクトリを作成します。 。および名前の一意性を取得するための他の関数。

0
prosti