私は他の人が書いたbashスクリプトを見ていますmktemp
。
TEMP=`mktemp --directory`
ただし、この行はマイコンピュータ(OS X 10.6)では機能しません。
* x に似ていないプラットフォーム間で互換性を持たせるには、この行をどのように変更する必要がありますか?編集する:代替コマンドで十分です。
答え1
ハードコードなしでLinuxとDarwin(Mac OS X 10.11以前のすべてのバージョン)で動作する一時ディレクトリを確実に作成するために使用した方法は次のとおり$TMPDIR
です/tmp
。
mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
背景:
GNU mktemp コマンドには引数は必要ありません。プレーンがmktemp
動作し、システムの一時ディレクトリに一時ファイルを生成します。
Plain はmktemp -d
Linux で必要なファイルの代わりにディレクトリを作成します。
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
tmp.XXXXXXXXXX
デフォルトでは、GNU mktempはサブディレクトリ(またはファイル)名のテンプレートを使用します。このテンプレートをカスタマイズするには、-t
このオプションを使用できます。
OSXのmktempにはデフォルトテンプレートがないため、テンプレートを指定する必要があります。残念ながら、GNU mktempはテンプレートを-t
オプションとして使用しますが、OSXでは位置引数として渡されます。対照的に、OSXのmktempには-t
別の意味を持つオプションがあります。 OSXのオプションは、-t
テンプレートの「プレフィックス」として文書化されています。拡張され、{prefix}.XXXXXXXX
Xが自動的に追加されます(たとえば、一時ディレクトリに作成可能mktemp -d -t example
)。example.zEJZWCTQ
$TMPDIR
多くのLinux環境でいいえデフォルト設定。多くの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用です。このコマンドは、1
「usage:...」エラーステータスコード応答でDarwin(Mac OS X)で失敗します。これが私たちがstderrを無視してMacのバリエーションを実行する理由です。このmytmpdir
プレフィックスはMacでのみ使用されます(このオプション設定が必要です)。
答え2
テンプレートを提供する必要があります。 mktemp -d /tmp/foo.XXXX
動作する必要があります。私はそのようなことを見たことがありません--directory
。これは--
GNU拡張であることを示します。
答え3
に変更 。--directory
前者-d
はGNU-ismですが、mktemp
GNUはcoreutilsもサポートしています-d
。 OS Xのものとmktemp
BSDのものと同じなので、-d
プログラムが実際に配布されているシステム間の移植性が良いはずですmktemp
。
答え4
LinuxとMac OSのディレクトリに一時フォルダが作成されるようにするために私が見つけた/tmp
最高のソリューションは次のとおりです。mktemp -d '/tmp/mytmpdir.XXXXXX'
お役に立てば幸いです。