回答:
以下は、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他の何かを意味するオプションがあります。-tOSX のオプションは、テンプレートの「プレフィックス」として文書化されています。に展開される{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 -dOS X 10.11.5エルキャピタンに、それが期待通りに働いていた:file $(mktemp -d): /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
に変更--directoryし-dます。前者はGNU主義ですが、mktempcoreutilsのGNU もサポートしています-d。mktempOS Xでは、BSDと同じであるので、-d実際に出荷するシステムの中ではかなり移植する必要がありますmktempプログラムを。
mktemp -d、動作しません。
mktempOS X上では、テンプレートが必要です。使用しているスクリプトは、GNU規則を前提としています。GNU規則では、指定されていない場合はデフォルトのテンプレートが使用されます。
XXXXXOS Xが互換性のあるテンプレートフラグがあるかどうかわからない場合、unix がテンプレートで提供されることを期待しているということです。
mktempOS 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")"
mktempBSD(OSXを含む)にはテンプレートが必要ですが、テンプレートX内のsはいくつでも許可されます。mktempLinuxの場合、テンプレートは必要ありませんが、テンプレートが指定されている場合、Xs の数は6でなければなりません。これ-tはGNUmktempでは推奨されないため、より将来性のあるコードは次のようになります。
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"