2010-03-18 66 views
9

我需要一個新的臨時目錄在shell腳本中完成一些工作。當工作完成時(或者如果我中途殺死了作業),我希望腳本改回舊的工作目錄並清除臨時工作目錄。在Ruby中,它可能看起來像這樣:在shell腳本中臨時目錄中的臨時操作

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

您可以使用「CD - 」返回到以前的目錄。這樣你就不必保存舊目錄的名稱。另一種選擇是使用pushd/popd。 – JayM 2010-03-19 00:21:59

+0

我明確地存儲了目錄,給予do_stuff自由改變目錄,改變pushd隊列等等。但在我的情況下,我知道'do_stuff'不使用pushd/popd,所以這將是一個更好的實現! – JasonSmith 2010-03-19 01:03:27

+0

我不會相信'cd -'(在陷阱運行之前,腳本可能有多個地方「cd-ed」)。 – 2010-03-19 01:09:33

回答

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 
+2

您可以將EXIT添加到您的陷阱中,您不必執行明確的「rm」。 – 2010-03-18 23:27:45

+0

謝謝!這是一個很好的模式。我用我自己的版本更新了我的問題。儘管如此,我還沒有退出255。 – JasonSmith 2010-03-19 00:06:42

1

常用的工具來讓自己的臨時目錄是mktemp -d(和-p選項,您可以指定一個前綴目錄)。

我不確定是否「我想陷阱」也是一個問題,但bash的確讓你捕獲信號(驚喜!)trap - 請參閱文檔。

+0

謝謝。我知道如何使用這些組件。我在四處詢問人們將他們放在一起的首選方式。 – JasonSmith 2010-03-18 20:16:11

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