
Eu estava mexendo no terminal do Red Hat Linux, e quando digitei o asterisco ( *
) seguido de return, ele executou um dos programas do meu diretório. Por que?
Meu melhor palpite é que o Unix o tratou como um curinga e executou o primeiro programa alfabético. Como my_program.exe
e one_of_my_programs.program
pode ser executado simplesmente digitando o nome do arquivo, o operador curinga representa todos os arquivos possíveis. Como um programa é primeiro colocado em ordem alfabética, o Unix o executa. Este é um julgamento correto?
Responder1
Sua interpretação está correta. O restante dos arquivos será apresentado como sua lista de parâmetros.
Observe que isso será feito somente se o programa tiver o bit executável definido e o diretório atual estiver na PATH
lista.
Algumas notas que podem ajudar na compreensão: -
- Se você digitar
./*
, aPATH
entrada não será um requisito. - Se você digitar
. *
ou. ./*
e o primeiro arquivo correspondente for um script, então ele não precisa ser executável, nem precisa que o diretório atual estejaPATH
(pode não ser verdade para shells diferentes debash
).
Responder2
Isso sugere que isso .
faz parte da sua PATH
variável. Essa é uma péssima ideia por motivos de segurança (naturalmente, o Windows teve que torná-la um padrão inalterável).
No entanto, esta "sugestão" é apenas moderadamente válida: se você tiver um arquivo nomeado rm
em seu diretório atual, *
não há problema em executar opadrão rm
:
/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$
Como você pode ver, não foi rm
no diretório atual (um arquivo vazio e não executável) que foi executado, mas sim no diretório padrão do sistema /bin/rm
.
Sempre verifique seus comandos quando curingas estiverem envolvidos. Aqui está uma das mensagens mais aterrorizantes que já li:
rm: cannot remove '.o': No such file or directory
Este é o resultado de chamar
rm * .o
, mais ou menos o pior posicionamento de um espaço espúrio que alguém pode imaginar.