Quem lida com a estrela * em eco *

15

Quem lida (interpreta) o * em

echo *

O echo vê a estrela ou o shell cuidando disso e retorna uma lista de nome de arquivo ..

E sobre

cp temp temp*
    
por faressoft 13.04.2015 / 22:44

4 respostas

24

bash (ou o que você usa como shell), é a primeira coisa a ler qualquer entrada, e vai começar a interpretar caracteres especiais como ? e * . * é expandido para as correspondências no CWD , o que significa que o asterisco é substituído pelas correspondências mencionadas.

Na maioria dos casos, isso é bastante difícil, mas pode levar a alguns casos confusos de tempos em tempos.

Considere o seguinte. Um diretório tem este conteúdo:

  • teste (arquivo regular)
  • test1 (diretório)
  • test2 (diretório)
  • test3 (diretório)

Se você digitar mv * , algo aparentemente estranho acontece: test3 está lá, mas o resto desapareceu. Apesar de estranho no começo, faz sentido quando você entende o que o bash realmente passa para mv . Por causa do asterisco, bash interpreta mv * como mv test test1 test2 test3 , e quando mv pega essa lista, assume que o último argumento é o destino, onde todos os arquivos foram movidos.

Quanto aos comandos que você listou:

  • echo * pode funcionar como um pobrels. O shell expandirá o asterisco para o que estiver nesse diretório e, como eu tenho certeza que você já sabe, echo irá literalmente fazer eco de qualquer coisa que o bash passou para ele como argumentos.
  • cp temp temp* se comportará um pouco como o comando mv que descrevi acima, a menos que exista apenas um diretório chamado temp. Nesse caso, o nome da origem e do destino será o mesmo, ou seja, não fará nada.
por 13.04.2015 / 23:01
5

Como já foi dito, o shell expande * so echo receber como argumentos qualquer que seja o shell encontrado no diretório atual. No entanto, observe que, se a expansão não levar a nada, ou seja, se o diretório não contiver arquivos não ocultos, o * permanecerá inalterado e será passado 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 umls de um homem pobre, pois o primeiro não imprimirá nada, enquanto o segundo imprimirá * .

Da mesma forma, cp /tmp/temp temp* criará um arquivo chamado temp* no diretório atual se ainda não houver pelo menos um arquivo cujo nome comece com temp .

Por fim, se você quiser que o * seja informado inalterado, proteja-o da expansão usando aspas simples '*' , aspas duplas "*" ou barra invertida \* .

    
por 13.04.2015 / 23:21
4

No Bash, o shell lida com isso. Você vê que se você tentar * sem echo

Nota - com base em alguns comentários, eu sugiro ao executar * ENTER, criar um diretório e usar o comando touch para criar alguns arquivos, e certificar-se de que nenhum deles, ou pelo menos garantir que o primeiro seja alfabeticamente, 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 clichê

No Windows, * é manipulado pelo comando, portanto, dir *.* não é um clichê.

Note- Vendo alguns comentários, gostaria de acrescentar, há um risco correndo * e depois ENTER. Se você tem um arquivo chamado rm que é o primeiro na lista de diretórios, então é perigoso porque qualquer coisa depois dele será apagada. Além disso, e isso é menos provável, se o primeiro arquivo na listagem de diretórios for o nome de um script no caminho, ele será executado.

    
por 13.04.2015 / 23:03
-1

O shell executa várias expansões antes os argumentos são entregues ao comando.

Veja também link

Não específico do bash, consulte link

    
por 13.04.2015 / 22:49