Por que é sort -o útil?

32

A filosofia do UNIX diz: faça uma coisa e faça bem. Crie programas que manipulem texto, porque essa é uma interface universal.

O comando sort , pelo menos, classificação GNU, possui uma opção -o para produzir um arquivo em vez de stdout . Por que, digamos, sort foobar -o whatever é útil quando eu poderia apenas sort foobar > whatever ?

    
por strugee 06.10.2013 / 06:40

2 respostas

47

Não é apenas o tipo GNU que tem isso. O tipo BSD também tem. E por quê?
(Eu pensei que era uma boa pergunta também ...)

Na página do manual: "O argumento dado é o nome de um arquivo de saída a ser usado em vez da saída padrão. Este arquivo pode ser o mesmo que um dos arquivos de entrada. "

Você não pode ir para o mesmo arquivo com o redirecionamento, o redirecionamento de saída limpa o arquivo.

Para esclarecer ainda mais, se eu quisesse classificar um arquivo e colocar os resultados classificados no mesmo lugar, eu poderia tentar usar sort < foo > foo . Exceto o redirecionamento de saída trunca o arquivo foo na preparação para receber a saída. E então não há nada para classificar. Sem "-o", a maneira de fazer isso seria sort < foo > bar ; mv bar foo . Presumo que a opção -o faça algo semelhante sem que você precise se preocupar com isso.

    
por 06.10.2013 / 07:07
12

A opção '-o' já estava no sort do Sexta Edição do Unix

No entanto, eu concordo com você que não está dentro da filosofia Unix. uniq não tinha essa opção (e sort não tinha -u ).

No meu PDP-11 usei um pequeno programa que usaria um parâmetro:

renac whatever

Se whatever já existisse, ele escreveria tudo de stdin para um arquivo temporário, que só foi renomeado para whatever depois que a entrada stdin secou. Dessa forma, você poderia enviar a saída de qualquer comando para renac em vez de redirecionar para o nome do arquivo sem a chance de sobrescrever a entrada. Resolver o problema de sobrescrita dessa maneira é que a IMHO está mais em conformidade com a filosofia Unix.

Algumas adições posteriores ao programa foram: não sobrescrevendo o arquivo de saída se nada tivesse chegado no stdin (por exemplo, resultado de uma parte incorreta da linha de comando) e permitindo uma opção para anexar o stdin ao arquivo nomeado.

Este foi um dos primeiros (se não o primeiro) programa C real que eu fiz (para o meu trabalho eu desenvolvi principalmente em Pascal naquele sistema).

    
por 06.10.2013 / 08:18