回答:
以下は、LinuxとDarwin(Mac OS X 10.11より前のすべてのバージョン)の両方で動作する一時ディレクトリを、ハードコーディング$TMPDIR
もせずに確実に作成するために使用したものです/tmp
。
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
GNU mktempコマンドには引数は必要ありません。Plain mktemp
は動作し、システムの一時ディレクトリに一時ファイルを作成します。
Plain mktemp -d
はファイルの代わりにディレクトリを作成します。これはLinuxで使用したいものです。
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
デフォルトでは、GNU mktempはtmp.XXXXXXXXXX
サブディレクトリ(またはファイル)の名前にテンプレートを使用します。このテンプレートをカスタマイズするには、-t
オプションを使用できます。
OSXのmktempにはデフォルトのテンプレートがなく、テンプレートを指定する必要があります。残念ながら、GNU mktempがテンプレートを-t
オプションとして使用する場合、OSXではこれは位置引数として渡されます。代わりに、OSXのmktempには、-t
他の何かを意味するオプションがあります。-t
OSX のオプションは、テンプレートの「プレフィックス」として文書化されています。に展開される{prefix}.XXXXXXXX
ため、Xが自動的に追加されます(たとえば、tempディレクトリにmktemp -d -t example
作成できますexample.zEJZWCTQ
)。
多くのLinux環境で$TMPDIR
は、デフォルトで設定されていないことに驚きました。多くのCLIプログラムは設定時にサポートしていますが、それでものデフォルトが必要です/tmp
。これは$TMPDIR/example.XXXXXXXX
、mktempまたはmkdirに渡すことは、ローカルディスクのルートディレクトリで 生成される可能性があるため、危険であることを意味します/example.XXXXXXXX
($ TMPDIRが設定されず、空の文字列になるため)。
OSXでは、$TMPDIR
は常に設定され、(少なくともデフォルトのシェルでは)に設定されていません/tmp
(これはへのシンボリックリンクです/private/tmp
)が、に設定されてい/var/folders/dx/*****_*************/T
ます。したがって、OSXに対して行うことはすべて、そのデフォルトの動作を尊重する必要があります。
結論として、次は私がするために使用してしまったものです確実にLinuxとダーウィンの両方で動作する一時ディレクトリの作成のいずれかのハードコーディングせずに、(マックOS X)の$TMPDIR
か/tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
最初の部分はLinux用です。このコマンドは、ダーウィン(Mac OS X)では1
「usage:...」で応答するエラーステータスコードで失敗します。そのため、stderrを無視して、代わりにMacバリアントを実行します。mytmpdir
プレフィックスのみを(そのオプションを設定する必要がある)は、Mac上で使用されています。
mktemp -d
OS X 10.11.5エルキャピタンに、それが期待通りに働いていた:file $(mktemp -d)
: /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
に変更--directory
し-d
ます。前者はGNU主義ですが、mktemp
coreutilsのGNU もサポートしています-d
。mktemp
OS Xでは、BSDと同じであるので、-d
実際に出荷するシステムの中ではかなり移植する必要がありますmktemp
プログラムを。
mktemp -d
、動作しません。
mktemp
OS X上では、テンプレートが必要です。使用しているスクリプトは、GNU規則を前提としています。GNU規則では、指定されていない場合はデフォルトのテンプレートが使用されます。
XXXXX
OS Xが互換性のあるテンプレートフラグがあるかどうかわからない場合、unix がテンプレートで提供されることを期待しているということです。
mktemp
OS X 10.11.5でEl Capitanは私のために働きますfile $(mktemp -d)
::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
mktemp
BSD(OSXを含む)にはテンプレートが必要ですが、テンプレートX
内のsはいくつでも許可されます。mktemp
Linuxの場合、テンプレートは必要ありませんが、テンプレートが指定されている場合、X
s の数は6でなければなりません。これ-t
はGNUmktemp
では推奨されないため、より将来性のあるコードは次のようになります。
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"