Por que echointerpreta o *fazer o mesmo quels

Por que echointerpreta o *fazer o mesmo quels

Considere estes shellcomandos

$ls
my_app  newlist  note

e

$echo *
my_app  newlist  note

e

$printf *
my_app

O primeiro comando lslistará informações sobre os arquivos (o diretório atual por padrão). O segundo comando echoé um comando que gera as strings que estão sendo passadas como argumentos. No entanto, quando digito, echo *a saída é igual a ls.

E printf *apenas me dando o primeiro nome do arquivo como saída

Por que echointerpretar é *assim? E por que printf, sendo ainda mais estranho: apenas exibindo o primeiro?

Responder1

Por que echointerpreta o *fazer o mesmo quels

A resposta é simples. Não é. echofaz exatamente o que você diz: itera seus argumentos e os gera com um espaço entre eles.

Então, por que vemos um comportamento como ls?

Isso porque o shell substituirá o *por uma lista de parâmetros correspondente a todos os arquivos (não começando com a .(a menos que dotglob esteja ativado)). Depois echoé só fazer o que quer. Esta substituição glob acontecerá portodoscomandos, como é feito pelo shell, não pelo comando.

E daí printf?

printfé a formatação de impressão. O primeiro argumento é o formato. Se você fizer isso printf "%s " *, então é como echo.

Se o primeiro arquivo for hello%sworld, você obterá:hellofile2world hellofile3world

Para explorar mais

Experimente isso. Isso o ajudará a saber o que está acontecendo. (Não estou sugerindo que você use este código para algo real. Use-o apenas para aprender).

Tente cat /proc/self/cmdline * | less- Ele mostrará no início a aparência da linha de comando (depois que o shell tiver feito sua parte).

Responder2

só porque não tem entrada para exibir, mas uma lista de * (todos) arquivos como parâmetro para exibir como string

tão simples como isso

enquanto * é o parâmetro, ele ecoa o conteúdo "*" para que a lista de arquivos

informação relacionada