その作業のために一時ファイルを作成し、それ自体をクリーンアップする必要があるスクリプトがあります。私の質問は、一時ファイル用の適切なベースディレクトリを見つけることです。
スクリプトは、Git Bash(Windows)、Solaris、Linux、OSXなどの複数のプラットフォームで動作する必要があります。プラットフォームごとに、推奨される一時ディレクトリの表現は異なります。
%TMP%
(そしておそらく%TEMP%
)$TMPDIR
$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
これは面倒すぎるようです。もっと良い方法はありますか?
一時ファイルを処理するためのややポータブルな方法は、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))
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ユーザーからのフィードバックは大歓迎です。
同じことをより少ない行で探している場合...
for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
test -d "$TMPDIR" && break
done
これを1つに書き込めます。
あなたがするかもしれません:
: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit
シェルは、4つの選択肢のいずれかで実行可能ディレクトリを見つけるか、意味のあるエラーで終了する必要があります。それでも、POSIXは$TMPDIR
変数(XCUシステムの場合):
TMPDIR
この変数は、一時ファイルを作成する場所を必要とするプログラムで使用できるようにするディレクトリのパス名を表します。
また、/tmp
道。