2010-03-18 9 views
9

Necesito un nuevo directorio temporal para hacer algún trabajo en un script de shell. Cuando el trabajo esté terminado (o si elimino el trabajo a mitad de camino), quiero que el script vuelva al antiguo directorio de trabajo y borre el temporal. En Ruby, que podría tener este aspecto:Operación temporal en un directorio temporal en el script de 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" 

¿Cuál sería la mejor inversión por el dinero para hacer eso en un script Bash?

Aquí está mi implementación actual. ¿Alguna idea o sugerencia?

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

Puede utilizar 'cd -' para volver a la anterior directorio. De esta forma, no tiene que guardar el nombre del directorio anterior. Otra opción sería usar pushd/popd. – JayM

+0

Almacena explícitamente el directorio para dar libertad a 'do_stuff' para cambiar el directorio, cambiar la cola pushd, etc. Sin embargo, en mi caso sé que' do_stuff' no usa pushd/popd, ¡así que sería una implementación mucho más agradable! – JasonSmith

+0

No confío en 'cd -' (el script puede tener' cd'-ed en varios lugares antes de que se ejecute la trampa). –

Respuesta

15

Aquí van:

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

Puedes agregar EXIT a tu trampa y no tendrás que hacer el 'rm' explícito. –

+0

¡Gracias! Ese es un buen patrón. Actualicé mi pregunta con mi propia versión. Aunque no he salido de 255 así. – JasonSmith

1

La utilidad habitual para conseguirse un directorio temporal es mktemp -d (y la opción -p le permite especificar un directorio prefijo).

No estoy seguro de si "Quiero atrapar" también fue una pregunta, pero bash te permite atrapar señales con (¡sorpresa!) trap - mira la documentación.

+0

Gracias. Sé cómo usar los componentes. Estoy preguntando por las formas preferidas de las personas para unirlas. – JasonSmith

1

Suponiendo mktemp -d devuelve una ruta relativa, me olvide de $here y hacer esto en su lugar:

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 
Cuestiones relacionadas