A filosofia do UNIX diz: faça uma coisa e faça bem. Faça programas que manipulem texto, porque essa é uma interface universal.
O sort
comando, pelo menos GNU sort, tem uma -o
opção de saída para um arquivo em vez de stdout
. Por que é, digamos, sort foobar -o whatever
útil quando eu poderia simplesmente sort foobar > whatever
?
Responder1
Não é apenas o tipo GNU que o possui. O tipo BSD também tem. E por quê?
(Achei que era uma boa pergunta também...)
Na página de manual: "O argumento fornecido é o nome de um arquivo de saída a ser usado em vez da saída padrão. Este arquivo pode ser igual a um dos arquivos de entrada."
Você não pode ir para o mesmo arquivo com redirecionamento, o redirecionamento de saída apaga o arquivo.
Para esclarecer ainda mais, se eu quisesse classificar um arquivo e colocar os resultados classificados no mesmo lugar, talvez eu tentasse sort < foo > foo
. Exceto que 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 resolver. Sem "-o" a maneira de fazer isso seria sort < foo > bar ; mv bar foo
. Presumo que a -o
opção faça algo semelhante sem que você precise se preocupar com isso.
Responder2
A opção '-o' já estava no final sort
doSexta Edição do Unix
No entanto, concordo com você que isso não faz parte da filosofia Unix. uniq
não tinha essa opção (e sort
não tinha -u
então).
No meu PDP-11 usei um pequeno programa que levaria um parâmetro:
renac whatever
Se whatever
já existisse, ele gravaria tudo, desde stdin em um arquivo temporário, que só foi renomeado whatever
depois que a entrada stdin secou. Dessa forma, você poderia canalizar a saída de qualquer comando renac
em vez de redirecionar para o nome do arquivo sem a chance de sobrescrever a entrada. Resolver o problema de substituição dessa forma é IMHO mais conforme à filosofia Unix.
Algumas adições posteriores ao programa foram: não sobrescrever o arquivo de saída se nada tivesse chegado ao stdin (por exemplo, resultado de digitação incorreta de parte da linha de comando) e permitir uma opção para anexar stdin ao arquivo nomeado.
Este foi um dos primeiros (se não o primeiro) programas C reais que fiz (para o meu trabalho desenvolvi principalmente em Pascal naquele sistema).