Мне нужен новый временный каталог, чтобы сделать некоторую работу в сценарии оболочки. Когда работа сделана (или если я уничтожаю задание на полпути), я хочу, чтобы сценарий возвратился к старому рабочему каталогу и вытер временный. В 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
Итак:
#!/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
Обычная утилита для получения временного каталога - mktemp -d
(а опция -p
позволяет указать префиксный каталог).
Я не уверен, что «я хочу перехватить» тоже был вопросом, но bash позволяет перехватить сигналы (сюрприз!) trap
- см. Документацию.
Предполагая, что mktemp -d
возвращает относительный путь, я бы забыл о $ здесь
и сделал бы вместо этого:
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