Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何创建临时目录?_Bash_Temporary Directory - Fatal编程技术网

Bash 如何创建临时目录?

Bash 如何创建临时目录?,bash,temporary-directory,Bash,Temporary Directory,我使用创建tempfile,删除它并将其重新创建为目录: temp=`tempfile` rm -f $temp # <breakpoint> mkdir $temp temp=`tempfile` rm-f$temp # mkdir$temp 问题是,当它运行到时,恰好有另一个程序想要执行相同的操作,这将导致该程序失败。使用。它使用随机名称创建一个临时目录,并确保该文件不存在。不过,您需要记住在使用目录后删除它。我最喜欢的一行是 cd $(mktemp -d) 为了获得

我使用创建
tempfile
,删除它并将其重新创建为目录:

temp=`tempfile`
rm -f $temp
  # <breakpoint>
mkdir $temp
temp=`tempfile`
rm-f$temp
# 
mkdir$temp

问题是,当它运行到时,恰好有另一个程序想要执行相同的操作,这将导致该程序失败。

使用。它使用随机名称创建一个临时目录,并确保该文件不存在。不过,您需要记住在使用目录后删除它。

我最喜欢的一行是

cd $(mktemp -d)

为了获得更健壮的解决方案,我使用了如下内容。这样,在脚本退出后,temp dir将始终被删除

清除功能在退出信号上执行。这保证了总是调用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脚本的目录


猛击

以下代码片段将安全地创建一个临时目录(
-d
),并将其名称存储到
TMPDIR
中。(代码后面将显示
TMPDIR
变量的一个示例,该变量用于存储可能修改的原始文件。)

当接收到任何指定的错误时,第一行执行
exit 1
命令。第二个
陷阱
行删除(清除)程序退出时的
$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

下面是关于如何使用模板创建临时目录的简单说明

  • 安全地创建临时文件或目录,并打印其名称
  • 模板在最后一个组件中必须至少包含3个连续的“X”
  • 如果未指定模板,则将使用tmp.xxxxxxxxx
  • 创建的目录是u+rwx,减去umask限制
  • 
    父目录=./temp目录#(可选)为tempdir指定一个目录
    mkdir$PARENT_DIR
    TEMPLATE_PREFIX='tmp'#新tempdir模板的前缀
    模板_RANDOM='XXXX'#增加Xs以获得更多随机字符
    TEMPLATE=${PARENT\u DIR}/${TEMPLATE\u PREFIX}.${TEMPLATE\u RANDOM}
    #使用自定义$TEMPLATE创建tempdir,其中可能包括
    #一个路径,如父目录,并将新路径分配给变量
    新的目录路径=$(mktemp-d$模板)
    echo$NEW\u TEMP\u DIR\u路径
    #使用默认模板在父目录中创建tempdir
    #“tmp.xxxxxxxxx”并将新路径分配给变量
    新目录路径=$(mktemp-p$父目录)
    echo$NEW\u TEMP\u DIR\u路径
    #在系统默认tmp路径中创建tempdir,例如/tmp
    #使用默认模板“tmp.xxxxxxxxx”并将路径分配给var
    新建临时目录路径=$(mktemp-d)
    echo$NEW\u TEMP\u DIR\u路径
    #使用生成的temp dir和var保持其路径,可以执行任何操作
    
    我不得不使用
    mktemp-d-t
    这是OSX与Linux的较量。查看这个问题,了解一个同时适用于这两个版本的版本:另外,请参阅下面Ortwin提供的答案,因为这样可以确保也完成了清理。为什么您会说“您需要记住在使用该目录后删除该目录?”?这不是有点违背了使用临时目录的目的吗?@M.K.Safi我认为主要目的是创建一个空目录,在那里可以存储临时文件,而不会弄乱文件系统的其他部分。您可以选择是否/何时删除它。如果它在/tmp中创建它,那么在系统重新启动时应该清除它。并且
    rm$(pwd)
    ?:Palso有用:
    pushd$(mktemp-d)
    popd
    @ArranCudbard-Bell应该是
    rm-r$(pwd)
    @piggybox坦白地说,我会非常谨慎地使用
    rm-r$(pwd)
    。考虑临时目录创建失败的可能性(无论T/TMP文件系统是满的还是可能由于错误而重新安装只读)?然后
    cd$(mktemp-d)
    将计算为
    cd
    ,该值将更改为用户的主目录,随后将被删除。使用
    if pushd$(mktemp-d | echo BADMPDIR)可能是安全的;然后;rm-r$(pwd);popd;fi
    FreeBSD小心!FreeBSD上的mktemp没有-p选项,
    cleanup
    将rm-rf您当前的目录!很好,更新了脚本以检查是否可以创建临时目录。@真的吗?如果
    mktemp
    失败,
    WORK\u DIR
    将为空,这意味着命令将是
    rm-rf
    ,没有参数。我不使用FreeBSD,但如果
    rm-rf
    等同于
    rm-rf,我会非常惊讶。
    @jbg是的,现在对我来说也很奇怪-这应该不是什么大问题。我可能已经调整了这个脚本的旧版本,以便相对于当前目录计算临时目录的路径,从而导致当前目录删除的消失。为了更好,您可以避免空目录,或者至少使用解决方案将问题包含在目录中,您可以这样做:1
    TMPWORKDIR=$(basename'mktemp-d-p/tmp/git/)
    然后是2
    rmdir/tmp/git/“${TMPWORKDIR}”
    。如果变量现在为空,您仍将返回到
    /tmp/git/
    而不是整个系统。在回答中考虑这样的问题,我会欣然同意。虽然这是一个有趣的错误处理解决方案,但再多解释一下优点和可能的缺点就好了。1.
    -d
    检查目录。2.)终止已经是这些信号的默认值。