
Considere estes shell
comandos
$ls
my_app newlist note
e
$echo *
my_app newlist note
e
$printf *
my_app
O primeiro comando ls
listará 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 echo
interpretar é *
assim? E por que printf
, sendo ainda mais estranho: apenas exibindo o primeiro?
Responder1
Por que echo
interpreta o *
fazer o mesmo quels
A resposta é simples. Não é. echo
faz 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