ฉันใช้ในการสร้างtempfile
ลบออกและสร้างเป็นไดเรกทอรี:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
ปัญหาคือกระบวนการอื่นอาจได้รับชื่อเดียวกันX
ถ้าตั้งใจเรียกใช้ไฟล์ชั่วคราวหลังจากหนึ่งกระบวนการrm -f X
และก่อนหน้าmkdir X
นี้
ฉันใช้ในการสร้างtempfile
ลบออกและสร้างเป็นไดเรกทอรี:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
ปัญหาคือกระบวนการอื่นอาจได้รับชื่อเดียวกันX
ถ้าตั้งใจเรียกใช้ไฟล์ชั่วคราวหลังจากหนึ่งกระบวนการrm -f X
และก่อนหน้าmkdir X
นี้
คำตอบ:
mktemp -d
ใช้ มันสร้างไดเรกทอรีชั่วคราวด้วยชื่อแบบสุ่มและทำให้แน่ใจว่าไฟล์นั้นไม่มีอยู่ คุณต้องจำไว้ว่าให้ลบไดเรกทอรีหลังจากใช้งานแล้ว
สำหรับโซลูชันที่มีประสิทธิภาพยิ่งขึ้นฉันใช้บางอย่างดังต่อไปนี้ วิธีนี้จะเป็นการลบ temp dir เสมอหลังจากสคริปต์ออก
ฟังก์ชั่นการล้างข้อมูลจะดำเนินการกับ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
...
cleanup
จะrm -rf ไดเรกทอรีปัจจุบันของคุณ!
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
คำสั่งเมื่อได้รับสัญญาณใด ๆ ที่ระบุ trap
บรรทัดที่สองจะลบ (ล้างข้อมูล) $TMPDIR
ออกจากโปรแกรม (ทั้งปกติและผิดปกติ) เราเริ่มต้นกับดักเหล่านี้หลังจากที่เราตรวจสอบว่า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>