そのタスクの一時ファイルを作成し、それ自体をクリーンアップする必要があるスクリプトがあります。私の質問は、一時ファイルの正しいデフォルトディレクトリを見つける方法です。
このスクリプトは、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))
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ユーザーからのフィードバックをいただきありがとうございます。
答え2
少数の行で同じものを探している場合...
for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
test -d "$TMPDIR" && break
done
これを記事で書けばいいです。
答え3
次のことができます。
: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit
シェルは、4つの選択肢のいずれかで実行可能なディレクトリを見つけるか、意味のあるエラーで終了する必要があります。それにもかかわらず、POSIXは$TMPDIR
変数を定義します。(XCUシステム用):
TMPDIR
この変数は、一時ファイルを生成するための場所を必要とするプログラムで使用できるディレクトリのパス名を表す必要があります。
また、/tmp
パスが必要です。