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: test3
existe, 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 test3
e, 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, echo
literalmente ecoará qualquer coisa que o bash passar a ele como argumentos.cp temp temp*
terá um comportamento semelhante ao mv
comando 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 nullglob
serve.
echo *
, esse truque pode salvar você em alguns casos.
Como já foi dito, o shell se expande *
para echo
receber 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, ls
pois 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 -rf
e touch \-rf
mas 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