macOSのmktempは$ TMPDIRをサポートしていません。

macOSのmktempは$ TMPDIRをサポートしていません。

以前はこの内容を知っていましたが、回答をして再び言及されました。ディレクトリを同じ名前のディレクトリに移動するには?":

環境変数に関して、macOSのユーティリティはmktempLinuxまたはBSD(または少なくともOpenBSD)の同じ名前のユーティリティとは異なる動作をしますTMPDIR

一時ファイルを生成するには現在の目次は通常こう言うことができます。

tmdfile=$(TMPDIR=. mktemp)

または

tmpfile=$(TMPDIR=$PWD mktemp)

(がある一時ディレクトリの場合も同様mktemp -d)。

macOSでは、次のように実際のテンプレートを提供して、ユーティリティが現在のディレクトリを使用するように強制する必要がありました。

tmpfile=(mktemp ./tmp.XXXXXXXX)

使いやすく、tmpfile=$(TMPDIR=. mktemp)この変数は無視され、同じ名前のディレクトリにファイルが作成されますTMPDIR/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T

macOSのドキュメントには次のものがありmktempます。

-t prefixこのオプションを指定すると、プレフィックスと構成変数(使用可能な場合)にmktemp基づいてテンプレート文字列が生成されます。利用できない_CS_DARWIN_USER_TEMP_DIR場合、_CS_DARWIN_USER_TEMP_DIR代替位置はTMPDIRと です/tmp

私のシステムでは_CS_DARWIN_USER_TEMP_DIR設定されていないようです。

$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'

しかし、例えば

tmpfile=$(TMPDIR=. mktemp -t hello)

それでも以下にファイルを作成します/var/folders/.../$PWD代わりに使用しても同じです.)。

私は気づいた

$ getconf DARWIN_USER_TEMP_DIR
/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T/

しかし、この値を変更する方法がわからないので、これは私にとってあまり役に立ちません。

macOSmktempユーティリティはFreeBSDから来て、OpenBSDからインポートされたと言われています。

質問:

これはmacOS実装のバグ(または欠落)ですかmktemp?スクリプトでDARWIN_USER_TEMP_DIR値(またはマニュアルに記載されているように)をどのように変更できますか_CS_DARWIN_USER_TEMP_DIR(理想的には値の設定を解除して優先順位を付けたいと思います$TMPDIR)。

答え1

/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/

これがあなたのダーウィンですユーザーローカル目次。その名前は単にMacOS Concatenated Modified Base 32 Encodingです。ユーザーUUIDMacOS(BSD)ユーザーID。エンコーディングの最初の2文字は、ディレクトリサイズを小さく保つために「バケット」システムとして使用されます。これら2つの文字は、ユーザーUUIDの最初の10桁をエンコードします。なぜなら、Base 32では数字はもちろん5桁だからです。

サブディレクトリはあなたのものですユーザーエリア温度そしてユーザーローカルキャッシュ目次。以前の名前は-Caches-andでしたが、今はand-Tmp-に短縮されました。明らかに、これらの名前はすべて固定されており、ユーザーIDまたはユーザーUUIDを変更したくない限り変更できません。CT

アプリケーションが呼び出されると、confstr(_CS_DARWIN_USER_TEMP_DIR,…)Cライブラリは最初にユーザーユーザーローカルディレクトリを確認してユーザーエリア温度その中にディレクトリがあります。

あなたが持っていることを確認してくださいユーザーローカルディレクトリはアクセスできないため重要ではありません。したがって、スーパーユーザー権限で実行され、Cライブラリの実装でアプリケーションのMach IPC呼び出しに応答してこれらのディレクトリを安全に作成するMach起動デーモンが/var/foldersあります。あなたdirhelperconfstr()する書き込み権限があるユーザーローカルこれはディレクトリ(一度作成された場合)なので、Cライブラリはmkdir()そのディレクトリの直接の子です(まだ存在しない場合)。

成功すると、mktempプログラムは環境変数の値を決してチェックしません。なぜなら、TMPDIRコードのフォールバックは呼び出しから呼び出しに進み、その逆ではないからです。ほぼ常に動作します。失敗モードは、起動デーモンが実行されないか、サブディレクトリを作成しようとするとエラーで失敗することです。mktempconfstr()getenv()confstr(_CS_DARWIN_USER_TEMP_DIR,…)dirhelperT外のディレクトリが既に存在します。

ディレクトリの外側にコンテンツを配置できますが、Tこれは起動デーモンによって定期的にクリーンアップされるため、dirhelperディレクトリ内のコンテンツは削除されます/var/folders。起動デーモンを無効にするとdirhelper独自の問題が発生し、その中で最も重要なことはクリーンアップ/var/foldersされないことです。自分への書き込みアクセスを拒否します。ユーザーローカルディレクトリはすべてを妨げる可能性がありますその他その目的はサブディレクトリだけのためではありませんT

テンプレートを提供することに加えて、最良のオプションはTシンボリックリンクを生成することですが、同時に一時ファイルを生成しようとしている実行中のすべてのアプリケーションに影響を与えるため、まだ悪いことです。

変数名も同じですDARWIN_USER_TEMP_DIR。文字列を構成するユーティリティとライブラリ関数の名前_CS_DARWIN_USER_TEMP_DIRgetconfconfstr()

関連情報