Quem lida (interpreta) o * em
echo *
O eco vê a estrela ou a concha se preocupa com isso e retorna uma lista de nome de arquivo.
A respeito
cp temp temp*
Quem lida (interpreta) o * em
echo *
O eco vê a estrela ou a concha se preocupa com isso e retorna uma lista de nome de arquivo.
A respeito
cp temp temp*
Respostas:
bash (ou o que você usar como shell), é a primeira coisa a ler qualquer entrada e começará a interpretar caracteres especiais como ?e *. *é expandido para quaisquer correspondências no CWD , o que significa que o asterisco é substituído pelas referidas correspondências.
Na maioria dos casos, isso é bastante complicado, mas pode levar a alguns casos confusos de tempos em tempos.
Considere o seguinte. Um diretório possui este conteúdo:
Se você digitar mv *algo aparentemente estranho, acontece: test3existe, mas o resto se foi. Embora estranho no começo, faz sentido quando você entende o que o bash realmente passa mv. Por causa do asterisco, o bash interpreta mv *como mv test test1 test2 test3e, quando mv obtém essa lista, assume-se que o último argumento é o destino, que é onde todos os arquivos teriam sido movidos.
Quanto aos comandos que você listou:
echo *pode funcionar como um homem pobre ls. O shell expandirá o asterisco para o que estiver nesse diretório e, como tenho certeza de que você já sabe, echoliteralmente ecoará qualquer coisa que o bash passar a ele como argumentos.cp temp temp*terá um comportamento semelhante ao mvcomando que descrevi acima, a menos que haja apenas um diretório chamado temp; nesse caso, o nome de origem e destino é o mesmo, ou seja, não fará nada.*vez de ls. Por exemplo, for f in *; doé mais confiável do que for f in $(ls)se um nome de arquivo contiver espaço em branco ou caractere glob. (Será, no entanto, falhar se não houver arquivos na CWD, então você precisa verificar para esse caso.)
shopt nullglobserve.
echo *, esse truque pode salvar você em alguns casos.
Como já foi dito, o shell se expande *para echoreceber como argumentos o que o shell encontrar no diretório atual. No entanto, observe que, se a expansão não resultar em nada, ou seja, nesse caso, se o diretório não contiver arquivos não ocultos, ele *permanecerá inalterado e transmitido como está para o comando chamado (a menos que opções não padrão sejam usadas com alguns shells como bash). echo *não vai se comportar como um homem pobre, lspois o primeiro não imprime nada enquanto o segundo imprime *.
Da mesma forma, cp /tmp/temp temp*criará um arquivo nomeado temp*no diretório atual se ainda não houver pelo menos um arquivo com o qual o nome comece temp.
Por fim, se você deseja que a *transmissão seja inalterada, seja qual for o caso, é possível protegê-lo da expansão usando aspas simples '*', aspas duplas "*"ou barra invertida \*.
No Bash, o shell lida com isso. Você vê que, se você tentar *sem eco
Nota: com base em alguns comentários, sugiro que, ao executar * ENTER, crie um diretório e use o comando touch para criar alguns arquivos e verifique se nenhum deles, ou pelo menos verifique se o primeiro em ordem alfabética não é o nome de qualquer script ou comando no caminho.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Então ls *é um pouco de clichê
No Windows, *é tratado pelo comando, portanto, dir *.*não é um clichê.
Nota- Vendo alguns comentários, eu acrescentaria, há um risco correndo * e depois ENTER. Se você tem um arquivo chamado rm, o primeiro na lista de diretórios, é perigoso porque qualquer coisa após a exclusão será excluída. Além disso, e isso é menos improvável, se o primeiro arquivo na lista de diretórios for o nome de um script no caminho, ele será executado.
rm, é claro.
-rf? Eu tentei touch -rfe touch \-rfmas não está criando.
-rf? (Eu entendo o perigo de um arquivo chamado rm e um arquivo chamado -rf, eo problema de digitação * e empurrando entrar em uma pasta importante, eu não planejo fazer isso)
O shell executa várias expansões antes que os argumentos sejam entregues ao comando.
Veja também https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
Não é específico do bash, consulte http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01