我用来创建一个tempfile,删除它并重新创建一个目录:
temp=`tempfile`
rm -f $temp
# <breakpoint>
mkdir $temp
问题是,当它运行到<断点>时,恰好有另一个程序想要做同样的事情,mkdir-ed了一个具有相同名称的临时目录,将导致该程序失败。
我用来创建一个tempfile,删除它并重新创建一个目录:
temp=`tempfile`
rm -f $temp
# <breakpoint>
mkdir $temp
问题是,当它运行到<断点>时,恰好有另一个程序想要做同样的事情,mkdir-ed了一个具有相同名称的临时目录,将导致该程序失败。
当前回答
下面的代码片段将安全地创建并清理一个临时目录。
当接收到任何指定的信号时,第一行trap将执行exit 1命令。第二个陷阱行删除程序退出时的$TEMPD(正常和异常)。我们在检查mkdir -d成功后初始化这些陷阱,以避免意外执行$TEMPD处于未知状态的退出陷阱。
#!/bin/bash
# set -x # un-comment to see what's going on when you run the script
# Create a temporary directory and store its name in a variable.
TEMPD=$(mktemp -d)
# Exit if the temp directory wasn't created successfully.
if [ ! -e "$TEMPD" ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure the temp directory gets removed on script exit.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TEMPD"' EXIT
其他回答
我需要以下功能:
将所有临时文件放入具有特定名称空间的单个目录中以供重用。 创建带有文件名前缀和后缀(扩展名)的临时文件。
在macOS上使用bash脚本:
$ namespace="com.namespace.mktemp"
# find directory for reusing
$ ls -d "${TMPDIR}${namespace}"*
# create directory if not exists
$ mktemp -d -t "$namespace"
/var/folders/s_/.../T/com.namespace.mktemp.HjqGT6w2
# create tempfile with directory name and file prefix
$ mktemp -t "com.namespace.mktemp.HjqGT6w2/file-prefix"
/var/folders/s_/.../T/com.namespace.mktemp.HjqGT6w2/file-prefix.sZDvjo14
# add suffix - `mktemp` on macOS does not support `--suffix`
mv "/var/folders/s_/.../file-prefix.sZDvjo14" "/var/folders/s_/.../file-prefix.sZDvjo14.txt"
gmktemp (brew install coreutils)略有不同:
支持——suffix和——tmpdir 模板和前缀中需要x 模板不应包含目录,请设置TMPDIR
$ namespace="com.namespace.gmktemp"
# create directory if not exists
$ gmktemp -d -t "$namespace.XXXXXXXX"
/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ
# set TMPDIR
TMPDIR="/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ"
# create tempfile with directory name and file prefix
$ gmktemp --suffix=".txt" -t "prefix.XXXXXXXX"
/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ/prefix.LWHj0G95.txt
对于一个更健壮的解决方案,我使用类似下面的东西。这样,临时目录将在脚本退出后始终被删除。
清除函数在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脚本的目录。
Bash陷阱。
我最喜欢的一句话是
cd $(mktemp -d)
下面的代码片段将安全地创建并清理一个临时目录。
当接收到任何指定的信号时,第一行trap将执行exit 1命令。第二个陷阱行删除程序退出时的$TEMPD(正常和异常)。我们在检查mkdir -d成功后初始化这些陷阱,以避免意外执行$TEMPD处于未知状态的退出陷阱。
#!/bin/bash
# set -x # un-comment to see what's going on when you run the script
# Create a temporary directory and store its name in a variable.
TEMPD=$(mktemp -d)
# Exit if the temp directory wasn't created successfully.
if [ ! -e "$TEMPD" ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure the temp directory gets removed on script exit.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TEMPD"' EXIT
使用mktemp -d。它创建一个随机名称的临时目录,并确保该文件不存在。不过,您需要记得在使用该目录后删除它。