Por que a expansão de chave não é suportada?


9

Preciso fazer alguma configuração para iniciar a expansão de chaves? Quando corro mkdir {1..10}, ele apenas cria uma nomeação de diretório {1..10}.


mkdir {1..10}funciona para mim, cria dez dirs.
Suspeito # 29/13

2
Aconselho adicionar echo ${SHELL}para tornar esta pergunta capaz de obter uma resposta útil.
dan

Respostas:


10

Embora a expansão da braçadeira se {1,2}origine no cshfinal dos anos 70 e tenha chegado às conchas do tipo Bourne no bash/ zsh/ pdkshno final dos anos 80, início dos anos 90, a {n1..n2}variante surgiu mais tarde zshem 1995 (2,6-beta4).

bashcopiou-o em 2004 (3.0) e ksh93em 2005 ( ksh93r).

Provavelmente o shell em que você está tentando isso não é um desses ou é uma versão mais antiga do bashe ksh93.


Deveríamos perguntar que tipo de concha de banco ele usava. / suspeita de mim é #!/bin/sh...
Polemon

3
@ Polemon, isso não ajudaria necessariamente. Por exemplo, em alguns sistemas /bin/shé bashou ksh93.
Stéphane Chazelas

2
Na verdade, acho que sim: dependendo da invocação, os shells invocados /bin/sh funcionam como históricos sh(é o que a página de manual do bash diz mesmo assim). Não verifiquei ksha página de manual, mas tenho certeza de que ela se comportará de acordo.
Polemon 29/09

1
@ user43312: por que você ainda está usando o RH9? Ele foi mantido por muitos e muitos anos. Como Stephane escreveu, é um recurso das versões recentes do bash. Portanto, é muito improvável que sua versão do bash o suporte. Você pode verificar a versão usando o bash --version. E só para ter certeza, verifique se você está executando um shell bash, verificando a variável $ SHELL ou simplesmente executando o ps. Para usar esse recurso, você pode tentar iniciar um shell zsh ( zsh) primeiro. Outra solução alternativa seria usar algo como "mkdir $ (seq 1 10)".
Bram

1
@polemon O comportamento de inicialização de outro shell (ou seja, quais arquivos ele origina na inicialização), não imitando outro shell.
Chris Baixo

4

{x..y}A expansão do intervalo de chaves é implementada no bash 3.0-alpha. Para nos ajudar e a si mesmo, por favor, mostre sua echo "$BASH_VERSION"saída.

Então a resposta: Se mkdir {1..10}cria um dir com o nome {1..10}, você está usando uma versão do bash anterior bash 3.0-alpha. Nesse caso, você pode usar uma construção de loop for como:

for ((i=1;i<=10; i++)); do mkdir "$i"; done


1

Verifique sua versão do Bash:

$ bash -version
GNU bash, version 4.1.7(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

Verifique também mkdirse não há aliases de alguma maneira estranha:

$ alias |grep mkdir
alias md='mkdir'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.