Por que a classificação -o é útil?

32

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

O sortcomando, pelo menos a classificação GNU, tem uma -oopção para gerar um arquivo em vez de stdout. Por que, por exemplo, é sort foobar -o whateverútil quando eu poderia apenas sort foobar > whatever?

strugee
fonte
3
GNU não é UNIX. Em muitos aspectos, é diferente, por exemplo, argumentos detalhados (--help, etc.).
Sakisk
@ faif sim, isso é verdade . mas eu argumentaria que essa não é uma resposta para essa pergunta específica.
strugee
2
É por isso que eu deixei-o como um comentário e não uma resposta :)
sakisk

Respostas:

47

Não é apenas o tipo GNU que o possui. A classificação BSD também tem. E por que?
(Eu pensei que era uma boa pergunta também ...)

Na página do manual: "O argumento fornecido é o nome de um arquivo de saída a ser usado em vez da saída padrão. Esse 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 limpa o arquivo.

Para esclarecer melhor, se eu quiser classificar um arquivo e colocar os resultados classificados no mesmo local, acho que tente sort < foo > foo. Exceto que o redirecionamento de saída trunca o arquivo fooem 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 -oopção faça algo semelhante sem que você precise se preocupar com isso.

Kurtm
fonte
12
Também é possível sudo sort -o /some/placeque seu usuário não privado não tenha permissão para gravar.
bahamat
8
E para ajudar a evitar confusão com o comentário de bahamat: ele não está dizendo que eles podem classificar um arquivo para o qual não têm permissão. O redirecionamento de E / S funciona mal com o sudo. Como o redirecionamento ocorre no seu shell (sudo é apenas um comando que será executado), usar o redirecionamento com um comando via sudo é irritante. (Eu estava inicialmente confuso sobre o que bahamat estava dizendo, então imaginei que outros também poderiam estar confusos).
Kurtm #
3
Apenas para interpretar o advogado do diabo, existem realmente alternativas ao problema "arquivo de entrada é o mesmo que arquivo de saída" e ao problema de "redirecionamento privilegiado", e ambas as alternativas estão mais no espírito de "faça uma coisa bem". Para "input = output", existe sponge(parte de moreutils). Para redirecionamento privilegiado, há canalização | sudo tee, o que também tem o benefício de limitar a escalação de privilégios a um único programa simples tee.
Jw013 10/10
Bons pontos. Embora a -oopção sortexistisse muito antes da esponja existir. É pelo menos tão antigo quanto o 4.4-lite2 (que é onde o histórico começa no OpenBSD CVS). E para um caso em que você está operando em um arquivo não privilegiado e gravando em uma área privilegiada, | sudo teefunciona muito bem, mas, na maioria das vezes, você quer que a coisa toda seja privilegiada e o sudoincentiva. E sudo grep file | sudo teeé bobo.
Kurtm 10/10
1
sortprecisa ler toda a entrada antes que ela possa começar a produzir algo, é por isso que ela pode sobrescrever sua entrada com segurança. Pode armazenar os dados na memória ou em arquivos temporários antes de iniciar a saída.
Stéphane Chazelas
12

A opção '-o' já estava no o sortda sexta edição do Unix

No entanto, eu concordo com você que não faz parte da filosofia do Unix. uniqnão tinha essa opção (e sortnão tinha uma -uentão).

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

renac whatever

Se whateverjá existisse, ele escreveria tudo, desde stdin até um arquivo temporário, que só foi renomeado para whateverdepois que a entrada stdin secou. Dessa forma, você pode canalizar a saída de qualquer comando em renacvez de redirecionar para o nome do arquivo sem a chance de sobrescrever a entrada. Resolver o problema de substituição dessa maneira é IMHO mais compatível com a filosofia do 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 a opção de acrescentar o stdin ao arquivo nomeado.

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

Anthon
fonte
Se eu entendi bem, aptsabor pessoas GNU / Linux podem ter uma versão reescrita da funcionalidade renacfornecido, com um programa chamado sponge(a partir de man: absorver entrada e gravação padrão para um arquivo ), package . Moreutils`
41754
@uprego. Eu apenas procurei a fonte do sponge.c e parece ter muito código sobrecarregado por causa da funcionalidade de esponja (stdin -> stdout).
Anthon
O @uprego spongenem moreutilsfoi criado pelo GNU.
Jw013 10/10
Eu não pretendia afirmar isso.
41754 11/11