Evitando arquivos temporários em zsh [duplicado]

5

Digamos que eu tenha o arquivo data.txt e o comando cmd .

cmd recebe um argumento, um arquivo. Ou você poderia usar stdin .

Agora, digamos que data.txt é maiúsculo, mas cmd só funciona se todos os dados estiverem em minúsculas.

Claro, você poderia fazer isso

tr '[:upper:]' '[:lower:]' < data.txt > lowercase_data.txt
cmd lowercase_data.txt
rm lowercase_data.txt

Mas, existe uma maneira de integrar isso?

Da mesma forma, um wrapper em torno do arquivo original, que aplica um filtro, passa uma referência ao arquivo temporário; o comando é executado; por último, o arquivo temporário é excluído?

Eu uso o zsh.

    
por Emanuel Berg 04.02.2013 / 01:13

2 respostas

6

zsh suporta substituição de processos , que deve fazer o que você está perguntando:

A command of the form =(...) is replaced with the name of a file containing its output.

Portanto, para o seu exemplo, para evitar a criação manual de um arquivo temporário para passar a saída de tr para cmd , você poderia dizer

cmd =(tr '[:upper:]' '[:lower:]' < data.txt)

Para outras camadas, o equivalente seria:

  • bash : cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • ksh : cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • rc : cmd <{tr '[:upper:]' '[:lower:]' < data.txt}

Observe que bash , ksh e rc implementam a substituição do processo usando pipes nomeados, em vez de arquivos temporários como zsh usa, e exigem que o sistema de arquivos /dev/fd/ seja montado

    
por 04.02.2013 / 01:43
2

Não há nada de errado com a maneira como você faz isso. Exceto pela maneira como você cria seus arquivos temporários (e se o script que você está executando for executado duas vezes ao mesmo tempo?).

Você deve usar mktemp .

    
por 04.02.2013 / 01:20