10

我需要一个新的临时目录来在 shell 脚本中做一些工作。工作完成后(或者如果我中途终止工作),我希望脚本更改回旧的工作目录并清除临时目录。在 Ruby 中,它可能看起来像这样:

require 'tmpdir'

Dir.mktmpdir 'my_build' do |temp_dir|
  puts "Temporary workspace is #{temp_dir}"
  do_some_stuff(temp_dir)
end

puts "Temporary directory already deleted"

在 Bash 脚本中这样做最划算的是什么?

这是我目前的实现。有什么想法或建议吗?

here=$( pwd )
tdir=$( mktemp -d )
trap 'return_here' INT TERM EXIT
return_here () {
    cd "$here"
    [ -d "$tdir" ] && rm -rf "$tdir"
}

do_stuff # This may succeed, fail, change dir, or I may ^C it.
return_here
4

3 回答 3

15

干得好:

#!/bin/bash
TDIR=`mktemp -d`

trap "{ cd - ; rm -rf $TDIR; exit 255; }" SIGINT

cd $TDIR
# do important stuff here
cd -

rm -rf $TDIR

exit 0
于 2010-03-18T21:53:22.023 回答
1

为自己获取临时目录的常用实用程序是mktemp -d(并且该-p选项允许您指定前缀目录)。

我不确定“我想捕获”是否也是一个问题,但是 bash 确实可以让您捕获信号(惊喜!)trap- 请参阅文档。

于 2010-03-18T19:17:44.973 回答
1

假设mktemp -d返回一个相对路径名,我会忘记$here并这样做:

tdir=
cleanup() {
    test -n "$tdir" && test -d "$tdir" && rm -rf "$tdir"
}
tdir="$(pwd)/$(mktemp -d)"
trap cleanup EXIT
trap 'cleanup; exit 127' INT TERM

# no need to call cleanup explicitly, unless the shell itself crashes, the EXIT trap will run it for you
于 2010-03-19T01:18:56.220 回答