2010-03-18 47 views
9

Tôi cần thư mục tạm thời mới để thực hiện một số công việc trong tập lệnh shell. Khi công việc được thực hiện (hoặc nếu tôi giết công việc giữa chừng), tôi muốn tập lệnh thay đổi trở lại thư mục làm việc cũ và xóa sạch thư mục tạm thời. Trong Ruby, nó có thể trông giống như thế này:Hoạt động tạm thời trong một thư mục tạm thời trong tập lệnh 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" 

Điều gì sẽ là tốt nhất cho buck để làm điều đó trong một kịch bản Bash?

Đây là triển khai hiện tại của tôi. Bất kỳ suy nghĩ hoặc gợi ý nào?

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

Bạn có thể sử dụng 'cd -' để trở về trước danh mục. Bằng cách đó bạn không phải lưu tên của thư mục cũ. Một tùy chọn khác là sử dụng pushd/popd. – JayM

+0

Tôi đã lưu trữ thư mục để tự do thay đổi thư mục, thay đổi hàng đợi pushd, v.v. Tuy nhiên trong trường hợp của tôi, tôi biết 'do_stuff' không sử dụng pushd/popd để có thể thực hiện tốt hơn nhiều! – JasonSmith

+0

Tôi sẽ không tin tưởng 'cd -' (tập lệnh có thể có nhiều địa chỉ' cd'-ed trước khi bẫy chạy). –

Trả lời

15

Ở đây bạn đi:

#!/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

Bạn có thể thêm EXIT vào bẫy của bạn và bạn sẽ không phải thực hiện 'rm' rõ ràng. –

+0

Cảm ơn! Đó là một mô hình tốt. Tôi đã cập nhật câu hỏi của mình bằng phiên bản của riêng mình. Tôi đã không được thoát 255 như vậy mặc dù. – JasonSmith

1

Các tiện ích thông thường để có được cho mình một thư mục tạm thời là mktemp -d (và tùy chọn -p phép bạn chỉ định một thư mục prefix).

Tôi không chắc chắn nếu "Tôi muốn bẫy" là một câu hỏi quá, nhưng bash không cho phép bạn bẫy tín hiệu với (ngạc nhiên!) trap - xem tài liệu.

+0

Cảm ơn. Tôi biết cách sử dụng các thành phần. Tôi đang hỏi xung quanh về những cách ưa thích của mọi người để đưa tất cả chúng lại với nhau. – JasonSmith

1

Giả sử mktemp -d lợi nhuận một tên đường dẫn tương đối, tôi sẽ quên đi $here và làm điều này thay vì:

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 
Các vấn đề liên quan