Por que o pipe não funciona com o cat e localiza?

5

Estou tentando realizar isso:

locate pg_type.h | cat

Mas este comando simplesmente não faz nada diferente de localizar pg_type.h

O que devo mudar? Quero executar cat pg_type.h onde quer que pg_type.h esteja.

    
por Stephane Rolland 26.02.2013 / 00:02

2 respostas

12
locate -e0 '*/pg_type.h' | xargs -r0 cat

locate pg_type.h encontraria todos os arquivos com pg_type.h em seu caminho (assim, por exemplo, se houvesse um diretório rpg_type.horn , você acabaria exibindo todos os arquivos lá).

Sem -0 , a saída de locate não pode ser pós-processada porque os arquivos são separados por caracteres de nova linha, enquanto a nova linha é um caractere perfeitamente válido em um nome de arquivo.

cat sem argumentos grava para stdout o que lê de stdin, portanto locate | cat seria o mesmo que locate , cat passaria a saída de locate . O que você precisa é passar a lista de arquivos como argumentos para cat .

É para isso que normalmente utiliza xargs : converte um fluxo de dados em uma lista de argumentos. -r é não chamar cat se não houver entrada. Sem -0 (que como -r não é padrão, mas é encontrado em muitas implementações, pelo menos aquelas em que xargs é útil para qualquer coisa), xargs iria procurar por palavras em sua entrada para converter em argumentos, onde palavras são separados em branco e onde a barra invertida, aspas simples e duplas podem ser usadas para escapar desses separadores, então normalmente o formato locate usa para exibir nomes de arquivos.

É por isso que usamos a opção -0 para locate e xargs , que usa o caractere NUL (que é o único caractere não permitido em um caminho de arquivo) para separar nomes de arquivos.

Observe também que locate não é um comando padrão e existe um grande número de implementações diferentes com diferentes versões e diferentes opções e comportamentos. O código acima se aplica, pelo menos, a versões relativamente recentes das implementações locate e mlocate do GNU, que são as mais comuns nos sistemas operacionais baseados no Linux, pelo menos.

    
por 26.02.2013 / 00:20
4

Seu comando passa a saída de locate para cat no padrão. Não é isso que você quer. O que você quer é passar a saída de locate para cat como um argumento .

Eu acredito que a maneira de fazer isso é com xargs :

locate pg_type.h | xargs cat
    
por 26.02.2013 / 00:07

Tags