回答:
を使用し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スクリプトのディレクトリ。
バッシュトラップ。
cleanup
されます現在のディレクトリを-rf RM!
mktemp
失敗し、WORK_DIR
空になり、コマンドを意味するだけだろうrm -rf
引数なしで。私は、FreeBSDを使用していないが、場合、私はかなり驚いたことだろうrm -rf
と同等であったrm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
、その後2をrmdir /tmp/git/"${TMPWORKDIR}"
。ここで変数が空の場合でも/tmp/git/
、システム全体にフォールバックしません。答えでこのようなものを検討してください、そして私は喜んで同意します。;)
このための私のお気に入りのワンライナーは
cd $(mktemp -d)
rm $(pwd)
?:P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
。何らかの理由で一時ディレクトリの作成が失敗する可能性を考慮してください(おそらく/ tmpファイルシステムがいっぱいであるか、エラーのために読み取り専用で再マウントされていますか?)。次に、ユーザーのホームディレクトリへの変更をcd $(mktemp -d)
評価します。cd
この変更は、後で削除されます。
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
次のスニペットは、一時ディレクトリ(-d
)を安全に作成し、その名前をに保存しTMPDIR
ます。(TMPDIR
変数の使用例は、後で変更される可能性のある元のファイルを格納するために使用されるコードの後半に示されています。)
最初のtrap
行はexit 1
、指定された信号のいずれかが受信されたときにコマンドを実行します。2 trap
行目は、$TMPDIR
onプログラムの出口(正常と異常の両方)を削除(クリーンアップ)します。確認後、これらのトラップを初期化mkdir -d
し$TMPDIR
て、不明な状態で終了トラップが誤って実行されないようにしました。
#!/bin/bash
# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)
# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure it gets removed even if the script exits abnormally.
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
-d
ディレクトリをチェックします。2.)終了はすでにこれらの信号のデフォルトです。
mktemp -d -t <prefix>