OS Xのmktempの修正または代替

OS Xのmktempの修正または代替

私は他の人が書いた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 -dLinux で必要なファイルの代わりにディレクトリを作成します。

(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}.XXXXXXXXXが自動的に追加されます(たとえば、一時ディレクトリに作成可能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でのみ使用されます(このオプション設定が必要です)。

おすすめ記事