¿Podemos usar carpetas temporales como archivos temporales?
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
que se destruirá automáticamente después de esta salida de shell?
                    
                        file-descriptors
                                tmpfs
                                
                    
                    
                        Bob Johnson
fuente
                
                fuente

Respuestas:
En el caso de un archivo temporal, su ejemplo en la pregunta lo crearía, luego lo desvincularía del directorio (haciéndolo "desaparecer"), y cuando el script cierra el descriptor de archivo (probablemente al finalizar), el espacio ocupado por el archivo sería reclamable por el sistema. Esta es una forma común de manejar archivos temporales en idiomas como C.
Por lo que sé, no es posible abrir un directorio de la misma manera, al menos de ninguna manera que haga que el directorio sea utilizable.
Una forma común de eliminar archivos y directorios temporales al finalizar un script es mediante la instalación de una
EXITtrampa de limpieza . Los ejemplos de código que se proporcionan a continuación evitan tener que hacer malabarismos con los descriptores de archivos por completo.O puede llamar a una función de limpieza:
La
EXITtrampa no se ejecutará al recibir laKILLseñal (que no puede ser atrapada), lo que significa que no se realizará ninguna limpieza en ese momento. Sin embargo, se ejecutará cuando finalice debido a una señalINToTERM(si se ejecuta conbashoksh, en otros shells, es posible que desee agregar estas señales despuésEXITen latraplínea de comando), o cuando salga normalmente debido a que llega al final del script o ejecuta unexitllamada.fuente
.y... (Probado en Linux, no sé si eso es coherente en todas las plataformas)exec another-commandobviamente.Escriba una función de shell que se ejecutará cuando finalice su script. En el siguiente ejemplo, lo llamo 'limpieza' y configuro una trampa para que se ejecute en los niveles de salida, como: 0 1 2 3 6
Vea esta publicación para más información.
fuente
cleanupantes de una salida limpia (0) y al recibir SIGHUP (1), SIGINT (2), SIGQUIT (3) y SIGABRT (6). será no corrercleanupcuando las salidas de guión debido a SIGTERM, SIGSEGV, SIGKILL, SIGPIPE, etc. Esto es claramente deficiente.Puede introducirlo y luego eliminarlo, siempre que no intente utilizar rutas dentro de él después:
No lo he comprobado, pero lo más probable es que sea el mismo problema cuando utilizo openat (2) en C con un directorio que ya no existe en el sistema de archivos.
Si eres root y tienes Linux, puedes jugar con un espacio de nombres separado y
mount -t tmpfs tmpfs /dirdentro de él.Las respuestas canónicas (establecer una trampa en EXIT) no funcionan si su script se ve forzado a salir impuro (por ejemplo, con SIGKILL); eso puede dejar datos confidenciales dando vueltas.
Actualizar:
Aquí hay una pequeña utilidad que implementa el enfoque de espacio de nombres. Debería compilarse con
y
CAP_SYS_ADMINcapacidades de archivo dadas (como root) conCuando se ejecuta (como un usuario normal) como
dejará de compartir su espacio de nombres del sistema de archivos, montará un sistema de archivos tmpfs
/proc/sysvipc, chdir y ejecutarácommandcon los argumentos dados.commandserá no heredar lasCAP_SYS_ADMINcapacidades.Ese sistema de archivos no será accesible desde otro proceso que no se inicie
command, y desaparecerá mágicamente (con todos los archivos que se crearon dentro de él) cuandocommandy sus hijos mueran, sin importar cómo suceda eso. Tenga en cuenta que esto es solo compartir el espacio de nombres de montaje: no hay barreras duras entrecommandy otros procesos ejecutados por el mismo usuario; que todavía podría colarse dentro de su espacio de nombres ya sea a través deptrace(2),/proc/PID/cwdo por otros medios.El secuestro de lo "inútil"
/proc/sysvipces, por supuesto, una tontería, pero la alternativa hubiera sido el spam/tmpcon directorios vacíos que tendrían que ser eliminados o complicarían enormemente este pequeño programa con tenedores y esperas. Alternativamente,dirse puede cambiar por ej./mnt/chtmpy que sea creado por root en la instalación; no lo haga configurable por el usuario y no lo configure en una ruta de propiedad del usuario, ya que eso puede exponerlo a trampas de enlaces simbólicos y otras cosas peludas que no vale la pena perder el tiempo.chtmp.c
fuente
rm $PWDtrabajo, shell todavía está en ese directorio. Pero no se pueden poner archivos nuevos en esta "carpeta". Lo único que puede hacer es leer / escribir con el archivo & 3, y 4. Así que esto sigue siendo "archivo temporal", no "carpeta temporal".¿Necesitas un shell específico?
Si zsh es una opción, lea
zshexpn(1):Por ejemplo, uso esto en rifle (parte del administrador de archivos del guardabosques) para descifrar un archivo y luego ejecutar rifle en el archivo temporal, que se elimina cuando finaliza el subproceso. (no te olvides de configurar
$TERMCMD)fuente