Câu trả lời:
Sử dụng mktemp -d. Nó tạo một thư mục tạm thời với một tên ngẫu nhiên và đảm bảo rằng tệp đó không tồn tại. Bạn cần nhớ xóa thư mục sau khi sử dụng nó.
Đối với một giải pháp mạnh mẽ hơn, tôi sử dụng một cái gì đó như sau. Bằng cách đó, thư mục tạm thời sẽ luôn bị xóa sau khi thoát khỏi tập lệnh.
Chức năng dọn dẹp được thực hiện trên EXITtín hiệu. Điều đó đảm bảo rằng chức năng dọn dẹp luôn được gọi, ngay cả khi tập lệnh hủy bỏ ở đâu đó.
#!/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
...
Thư mục của bash script từ đây .
Bẫy Bash .
cleanupsẽ rm -rf thư mục hiện tại của bạn!
mktempthất bại, WORK_DIRsẽ trống, có nghĩa là lệnh sẽ rm -rfkhông có đối số. Tôi không sử dụng FreeBSD nhưng tôi khá ngạc nhiên nếu rm -rftương đương vớirm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')và sau đó 2 rmdir /tmp/git/"${TMPWORKDIR}".. Nếu bây giờ biến trống, bạn vẫn sẽ quay lại /tmp/git/không cho toàn bộ hệ thống. Hãy xem xét một cái gì đó như thế này trong câu trả lời và tôi sẽ vui lòng đồng ý. ;)
Lớp lót yêu thích của tôi cho việc này là
cd $(mktemp -d)
rm $(pwd)? : P
pushd $(mktemp -d)...popd
rm -r $(pwd)
rm -r $(pwd). Xem xét khả năng tạo thư mục tạm thời không thành công vì bất kỳ lý do gì (có thể hệ thống tập tin / tmp đã đầy hoặc đã được đọc lại chỉ đọc do lỗi?); sau đó cd $(mktemp -d)sẽ đánh giá cdnhững thay đổi đối với thư mục chính của người dùng, sau đó sẽ bị xóa.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
Đoạn mã sau sẽ tạo một thư mục tạm thời ( -d) một cách an toàn và lưu tên của nó vào TMPDIR. (Một ví dụ sử dụng TMPDIRbiến được hiển thị sau trong mã nơi nó được sử dụng để lưu trữ các tệp gốc sẽ có thể được sửa đổi.)
Dòng đầu tiên trapthực thi exit 1lệnh khi nhận được bất kỳ tín hiệu nào được chỉ định . Dòng thứ hai traploại bỏ (dọn sạch) $TMPDIRlối ra của chương trình (cả bình thường và bất thường). Chúng tôi khởi tạo các bẫy này sau khi chúng tôi kiểm tra xem mkdir -dđã thành công để tránh việc vô tình thực hiện bẫy thoát $TMPDIRtrong trạng thái không xác định.
#!/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
-dkiểm tra các thư mục. 2.) Chấm dứt đã là mặc định cho các tín hiệu.
mktemp -d -t <prefix>