Answers:
使用mktemp -d
。它使用随机名称创建一个临时目录,并确保该文件尚不存在。不过,您需要记住在使用目录后将其删除。
对于更强大的解决方案,我使用类似以下的内容。这样,脚本退出后,临时目录将始终被删除。
对EXIT
信号执行清除功能。这样可以确保始终调用cleanup函数,即使脚本在某处中止。
#!/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
它将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>