を作成してtempfile
削除し、ディレクトリとして再作成するために使用します。
temp=`tempfile`
rm -f $temp
# <breakpoint>
mkdir $temp
問題は、<breakpoint>まで実行すると、同じことを実行しようとする別のプログラムがたまたまあり、同じ名前の一時ディレクトリをmkdir -ed すると、このプログラムが失敗することです。
を作成してtempfile
削除し、ディレクトリとして再作成するために使用します。
temp=`tempfile`
rm -f $temp
# <breakpoint>
mkdir $temp
問題は、<breakpoint>まで実行すると、同じことを実行しようとする別のプログラムがたまたまあり、同じ名前の一時ディレクトリをmkdir -ed すると、このプログラムが失敗することです。
を使用しmktemp -d
ます。ランダムな名前で一時ディレクトリを作成し、ファイルがまだ存在しないことを確認します。ただし、使用後はディレクトリを削除することを忘れないでください。
より堅牢なソリューションについては、次のようなものを使用します。そうすれば、スクリプトが終了した後、一時ディレクトリは常に削除されます。
信号に対してクリーンアップ関数が実行されEXIT
ます。これにより、スクリプトがどこかで中止された場合でも、クリーンアップ関数が常に呼び出されることが保証されます。
#!/bin/bash
# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`
# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
echo "Could not create temp dir"
exit 1
fi
# deletes the temp directory
function cleanup {
rm -rf "$WORK_DIR"
echo "Deleted temp working directory $WORK_DIR"
}
# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT
# implementation of script starts here
...
ここからのbashスクリプトのディレクトリ。
バッシュトラップ。
これに対する私のお気に入りのワンライナーは
cd $(mktemp -d)
次のスニペットは、一時ディレクトリを安全に作成してクリーンアップします。
最初のtrap
行はexit 1
、指定されたシグナルのいずれかが受信されたときにコマンドを実行します。2行目は、 on プログラムの終了 (正常と異常の両方) をtrap
削除します。不明な状態で誤って終了トラップを実行することを避けるために、成功したこと$TMPDIR
を確認した後、これらのトラップを初期化します。mkdir -d
$TMPDIR
#!/bin/bash
# ---
# Create a temporary directory and store its name in a variable.
TMPDIR=$(mktemp -d)
# Exit if the temp directory wasn't created successfully.
if [ ! -e "$TMPDIR" ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure temp directory gets removed on script exit.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT
# ---
# Example use of TMPDIR:
for f in *.csv; do
cp "$f" "$TMPDIR"
# remove duplicate lines but keep order
perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
ここでは、テンプレートを使用して一時ディレクトリを作成する方法について簡単に説明します。
PARENT_DIR=./temp_dirs # (optional) specify a dir for your tempdirs
mkdir $PARENT_DIR
TEMPLATE_PREFIX='tmp' # prefix of your new tempdir template
TEMPLATE_RANDOM='XXXX' # Increase the Xs for more random characters
TEMPLATE=${PARENT_DIR}/${TEMPLATE_PREFIX}.${TEMPLATE_RANDOM}
# create the tempdir using your custom $TEMPLATE, which may include
# a path such as a parent dir, and assign the new path to a var
NEW_TEMP_DIR_PATH=$(mktemp -d $TEMPLATE)
echo $NEW_TEMP_DIR_PATH
# create the tempdir in parent dir, using default template
# 'tmp.XXXXXXXXXX' and assign the new path to a var
NEW_TEMP_DIR_PATH=$(mktemp -p $PARENT_DIR)
echo $NEW_TEMP_DIR_PATH
# create a tempdir in your systems default tmp path e.g. /tmp
# using the default template 'tmp.XXXXXXXXXX' and assign path to var
NEW_TEMP_DIR_PATH=$(mktemp -d)
echo $NEW_TEMP_DIR_PATH
# Do whatever you want with your generated temp dir and var holding its path