Comando Wrapper que executa o programa no diretório temporário e o exclui após a execução [duplicado]

2

Eu quero escrever um comando que:

  1. recebe outro comando como argumentos
  2. faz um 'cd' para uma pasta temporária
  3. executa o comando passado nos argumentos
  4. remove a pasta temporária depois

Algo parecido com isto:

run_in_temp_dir ~/bin/my_script_that_creates_lots_of_files.sh arg1 arg2

Mas faria sentido que tal comando já exista. Então, minha pergunta é, existe tal comando?

Edit: aparentemente as pessoas acham que isso é uma duplicata, mas eu pedi especificamente a possível existência de um comando wrapper. E sim, eu sou perfeitamente capaz de escrever este roteiro, eu só não quero reinventar a roda se não for necessário.

    
por Erik 07.03.2014 / 16:35

4 respostas

1

Eu não acho que exista entre as ferramentas padrão. Razões:

Funciona apenas em configurações muito específicas. Por exemplo, a maioria dos scripts são obrigatórios para serem executados no diretório atual porque eles fazem referência a arquivos locais. Mesmo arg1 e arg2 podem ser arquivos locais. A maioria dos scripts quebraria ou até danificaria. Por exemplo, e se o script em si for rm ../* e isso ocorrer em /tmp/ ? Remover qualquer coisa automaticamente é uma péssima ideia para uma ferramenta padrão.

Isso é algo que você definitivamente deveria escrever para um uso específico. Na verdade, faz sentido que seu roteiro faça isso internamente! Se você realmente não quer um ambiente local, você poderia usar mktemp para criar um diretório (possivelmente em algum lugar int / tmp), e colocar seus arquivos intermediários lá (melhor que o cd-ai, você apenas coloca os arquivos lá ). Então você também pode removê-lo depois.

    
por 07.03.2014 / 16:44
2

Muitos sistemas têm um comando mktemp que usa a opção -d , então você pode simplesmente fazer:

dir=$(mktemp -d) &&
  (cd -P -- "$dir" &&
  ~/bin/my_script_that_creates_lots_of_files.sh arg1 arg2) &&
  rm -rf -- "$dir"
    
por 07.03.2014 / 16:47
1

No meu conhecimento, não, esse comando não existe (pelo menos: um comando portátil que faz o que você quer).

Seria bastante trivial implementar isso, embora algo parecido com:

t_dir="$(mktemp -d)"
if [ $? -ne 0 ] || [ -z "${t_dir}" ] ; then
  printf "Unable to create temporary directory. Exiting."
  exit 1
else
  trap_tdir="rm -rf \"$t_dir\""
  trap "${trap_tdir}" 0
fi
(cd "${t_dir}" && run_your_script_with_args)

Esse trecho (não testado) deve criar um diretório temporário e configurá-lo para remoção assim que o script terminar (o que a trava faz).

Nós rodamos o cd e o comando dentro de um subshell, o que significa que quando a subshell sair, você deve estar de volta onde você começou, o script irá sair e a armadilha entrará em ação para limpar.

    
por 07.03.2014 / 16:53
0

Eu duvido que exista tal ordem, mas escrever é trivial:

#!/usr/bin/env bash

## create the temp directory
dir=$(mktemp -d)

## save the current directory
pwd="$PWD";

## move to the temp dir
cd "$dir"

## run the command given as an argument
"$@" &&

## remove the temp directory if the command exited successfully 
rm -rf "$dir"

## return to where you started from
cd "$pwd"

Não tenho certeza de qual é o objetivo disso, ele excluirá o que foi criado pelo comando antes de você ter a chance de vê-lo. Eu estou supondo que o comando que você deseja executar fará alterações em outro lugar do sistema, caso contrário, não há muito sentido nisso.

    
por 07.03.2014 / 16:46