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 EXIT
tí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 .
cleanup
sẽ rm -rf thư mục hiện tại của bạn!
mktemp
thất bại, WORK_DIR
sẽ trống, có nghĩa là lệnh sẽ rm -rf
không có đối số. Tôi không sử dụng FreeBSD nhưng tôi khá ngạc nhiên nếu rm -rf
tươ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á cd
nhữ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 TMPDIR
biế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 trap
thực thi exit 1
lệnh khi nhận được bất kỳ tín hiệu nào được chỉ định . Dòng thứ hai trap
loại bỏ (dọn sạch) $TMPDIR
lố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 $TMPDIR
trong 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
-d
kiể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>