我需要一个新的临时目录来在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
答案 0 :(得分: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
答案 1 :(得分:1)
获取临时目录的常用工具是mktemp -d
(-p
选项允许您指定前缀目录。)
我不确定“我想陷阱”是否也是一个问题,但bash确实让你捕获信号(惊喜!)trap
- 请参阅文档。
答案 2 :(得分: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