私は、誰かがmktemp
を使用して書いたbashスクリプトを見ています。
TEMP=`mktemp --directory`
ただし、この行は私のマシン(OS X 10.6)では機能しません。
この行を修正して、クロスun * xのようなプラットフォームと互換性を持たせるにはどうすればよいですか? 編集:別のコマンドでも十分です。
以下は、$TMPDIR
または/tmp
をハードコーディングせずに、LinuxとDarwin(Mac OS X 10.11より前のすべてのバージョン)の両方で動作する一時ディレクトリを確実に作成するために使用したものです。
mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
GNU mktempコマンドは引数を必要としません。プレーンmktemp
は機能し、システムの一時ディレクトリに一時ファイルを作成します。
単純な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
オプションがあります。OSXの-t
オプションは、ドキュメント化されていますテンプレートの「プレフィックス」として。これは{prefix}.XXXXXXXX
に展開されるため、Xが自動的に追加されます(たとえば、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とDarwinの両方で機能する一時ディレクトリを確実に作成するために使用したものです(Mac OS X)、ハードコーディングなし$TMPDIR
または/tmp
のいずれか:
mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
最初の部分はLinux用です。このコマンドは、「usage:...」で応答するエラーステータスコード1
でDarwin(Mac OS X)で失敗します。これがstderrを無視し、代わりにMacバリアントを実行する理由です。 mytmpdir
プレフィックスはMacでのみ使用されます(そのオプションを設定する必要がある場合)。
テンプレートを指定する必要があります。 mktemp -d /tmp/foo.XXXX
は動作するはずです。見たことがない --directory
。 --
は、これがGNU拡張機能であることを示唆しています。
--directory
を-d
に変更します。前者はGNU-ismですが、coreutilsのGNU mktemp
も-d
をサポートしています。OSXのmktemp
は、 BSDなので、実際にmktemp
プログラムを出荷するシステム間で-d
はかなり移植性が高いはずです。
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
mktemp
( [〜#〜] osx [〜#〜] を含む)にはテンプレートが必要ですが、テンプレートにはX
sをいくつでも含めることができます。mktemp
はテンプレートを必要としませんが、テンプレートが指定されている場合、X
sの数は6でなければなりません。ご了承ください -t
は GNU mktemp
では非推奨であるため、より将来性のあるコードは
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"