複数のプラットフォームで正しいtmpディレクトリを見つける

複数のプラットフォームで正しいtmpディレクトリを見つける

そのタスクの一時ファイルを作成し、それ自体をクリーンアップする必要があるスクリプトがあります。私の質問は、一時ファイルの正しいデフォルトディレクトリを見つける方法です。

このスクリプトは、Git Bash(Windows)、Solaris、Linux、OSXなど、複数のプラットフォームで実行する必要があります。デフォルトの一時ディレクトリはプラットフォームごとに異なって表現されます。

  • Windows:(%TMP%おそらく%TEMP%
  • オペレーティングシステム:$TMPDIR
  • Linux、UNIX: でなければなりませ$TMPDIRんが、試した複数のシステムでは設定されていないようです。

だから私のスクリプトに次の定型句を追加しました。

if test -d "$TMPDIR"; then
    :
elif test -d "$TMP"; then
    TMPDIR=$TMP
elif test -d /var/tmp; then
    TMPDIR=/var/tmp
else
    TMPDIR=/tmp
fi

これはとても退屈だと思います。もっと良い方法がありますか?

ベストアンサー1

一時ファイルを処理するより移植性の高い方法は、一時mktempファイルを生成し、そのパスを返す 。たとえば、

$ mktemp
/tmp/tmp.zVNygt4o7P
$ ls /tmp/tmp.zVNygt4o7P
/tmp/tmp.zVNygt4o7P

スクリプトで簡単に使用できます。

tmpfile=$(mktemp)
echo "Some temp. data..." > $tmpfile
rm $tmpfile

マニュアルページを読むと、必要に応じてオプションを設定できます。たとえば、

  • -dファイルの代わりにディレクトリを作成します。
  • -u名前を生成しますが、何も生成しません。

以下を使用して-u一時ディレクトリを簡単に検索できます。

$ tmpdir=$(dirname $(mktemp -u))

詳しくはmktempこちらをご覧ください

Mac OS Xエディタ関連:私はMac OSXシステムを使ったことがありませんが、以下のTyiloの意見に基づいてMac OSXでは、mktempテンプレートの提供を求めているようです。(これはLinuxのオプションのパラメータです。)引用:

テンプレートは、特定の数の「X」が追加されたファイル名です/tmp/temp.XXXX。たとえば、末尾の「X」は現在のプロセス番号および/または一意の文字の組み合わせで置き換えられます。 mktempが返すことができる固有のファイル名の数は、提供されている「X」の数によって異なります。 6つの「X」がある場合、mktempは56800235584(62 ** 6)可能なファイル名の1つを選択します。

マニュアルページには、この実装がOpenBSDのマニュアルページからインスピレーションを受けているとも記載されていますmktemp。したがって、OpenBSDとFreeBSDユーザーも同様の違いを見つけることができます(参照:歴史部分)。

ご存知のように、質問で探している一時ディレクトリを含むフルファイルパスを指定する必要があります。この小さな問題は-tスイッチで解決できます。このオプションは引数()が必要と思われますが、必要に応じて依存しているprefixようですmktemp$TMPDIR

全体として、次のコマンドを使用すると、上記と同じ結果が得られます。

$ tmpdir=$(dirname $(mktemp tmp.XXXXXXXXXX -ut))

私はこのソリューションを直接テストすることはできませんので、Mac OS Xユーザーからのフィードバックをいただきありがとうございます。

おすすめ記事