A filosofia do UNIX diz: faça uma coisa e faça bem. Crie programas que manipulam texto, porque essa é uma interface universal.
O sort
comando, pelo menos a classificação GNU, tem uma -o
opçã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
?
sort
unix-philosophy
strugee
fonte
fonte
Respostas:
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 arquivofoo
em preparação para receber a saída. E então não há nada para classificar. Sem "-o", a maneira de fazer isso seriasort < foo > bar ; mv bar foo
. Presumo que a-o
opção faça algo semelhante sem que você precise se preocupar com isso.fonte
sudo sort -o /some/place
que seu usuário não privado não tenha permissão para gravar.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 simplestee
.-o
opçãosort
existisse 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 tee
funciona muito bem, mas, na maioria das vezes, você quer que a coisa toda seja privilegiada e osudo
incentiva. Esudo grep file | sudo tee
é bobo.sort
precisa 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.A opção '-o' já estava no o
sort
da sexta edição do UnixNo entanto, eu concordo com você que não faz parte da filosofia do Unix.
uniq
não tinha essa opção (esort
não tinha uma-u
então).No meu PDP-11, usei um pequeno programa que usaria um parâmetro:
Se
whatever
já existisse, ele escreveria tudo, desde stdin até um arquivo temporário, que só foi renomeado parawhatever
depois que a entrada stdin secou. Dessa forma, você pode canalizar a saída de qualquer comando emrenac
vez 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).
fonte
apt
sabor pessoas GNU / Linux podem ter uma versão reescrita da funcionalidaderenac
fornecido, com um programa chamadosponge
(a partir deman
: absorver entrada e gravação padrão para um arquivo), package
. Moreutils`sponge
nemmoreutils
foi criado pelo GNU.