A questão fundamental é que file
espera nomes de arquivos como argumentos de linha de comando, não em stdin. Quando você escreve ls | file
, a saída de ls
está sendo passada como entrada para file
. Não como argumentos, como entrada.
Qual é a diferença?
-
Os argumentos da linha de comando são quando você grava sinalizadores e nomes de arquivos após um comando, como em
cmd arg1 arg2 arg3
. Em scripts de shell, esses argumentos estão disponíveis como as variáveis$1
,$2
,$3
etc. Em C, você os acessaria por meio dos argumentoschar **argv
eint argc
paramain()
. -
A entrada padrão, stdin, é um fluxo de dados. Alguns programas como
cat
ouwc
lêem de stdin quando não recebem nenhum argumento de linha de comando. Em um shell script, você pode usarread
para obter uma única linha de entrada. Em C você pode usarscanf()
ougetchar()
entre várias opções.
file
normalmente não lê de stdin. Ele espera que pelo menos um nome de arquivo seja passado como um argumento. É por isso que imprime o uso quando você escreve ls | file
, porque você não passou um argumento.
Você pode usar xargs
para converter stdin em argumentos, como em ls | xargs file
. Ainda assim, como terdon menciona , analisando ls
é uma má ideia. A maneira mais direta de fazer isso é simplesmente:
file *