web-dev-qa-db-ja.com

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

その作業のために一時ファイルを作成し、それ自体をクリーンアップする必要があるスクリプトがあります。私の質問は、一時ファイル用の適切なベースディレクトリを見つけることです。

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

  • ウィンドウズ: %TMP%(そしておそらく%TEMP%
  • OSX:$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

これは面倒すぎるようです。もっと良い方法はありますか?

48
janos

一時ファイルを処理するためのややポータブルな方法は、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のオプションの引数です)。引用:

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

manページには、この実装はmktempのOpenBSDのmanページに触発されたとも書かれています。したがって、OpenBSDおよびFreeBSDのユーザーも同様の相違を観察する可能性があります(Historyセクションを参照してください)。

さて、おそらく気づいたと思いますが、これには、質問で探している一時ディレクトリを含む完全なファイルパスを指定する必要があります。この小さな問題は、-tスイッチを使用して処理できます。このオプションは引数(prefix)を必要とするようですが、mktempは必要に応じて$TMPDIRに依存しているようです。

全体として、上記と同じ結果が得られるはずです...

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

この解決策を自分でテストすることはできないので、Mac OS Xユーザーからのフィードバックは大歓迎です。

76
John WH Smith

同じことをより少ない行で探している場合...

for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
    test -d "$TMPDIR" && break
done

これを1つに書き込めます。

10
frostschutz

あなたがするかもしれません:

: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit

シェルは、4つの選択肢のいずれかで実行可能ディレクトリを見つけるか、意味のあるエラーで終了する必要があります。それでも、POSIXは$TMPDIR変数(XCUシステムの場合)

TMPDIRこの変数は、一時ファイルを作成する場所を必要とするプログラムで使用できるようにするディレクトリのパス名を表します。

また、/tmp 道。

6
mikeserv