Временная операция во временной директории в скрипте оболочки - PullRequest
9 голосов
/ 18 марта 2010

Мне нужен свежий временный каталог, чтобы выполнить некоторую работу в сценарии оболочки. Когда работа будет завершена (или если я убью работу на полпути), я хочу, чтобы скрипт вернулся в старый рабочий каталог и удалил временный. В 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

Ответы [ 3 ]

15 голосов
/ 19 марта 2010

Вот, пожалуйста:

#!/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 голос
/ 19 марта 2010

Предполагая, что 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
1 голос
/ 18 марта 2010

Обычная утилита для получения временного каталога - mktemp -d (а опция -p позволяет вам указать каталог префикса).

Я не уверен, что вопрос "Я хочу перехватить" тоже был вопросом, но bash позволяет вам перехватывать сигналы с (удивлением!) trap - см. Документацию.

...