Dlaczego rozszerzenie nawiasu klamrowego nie jest obsługiwane?

9

Czy muszę wykonać konfigurację, aby rozpocząć rozszerzanie nawiasów? Kiedy uruchamiam mkdir {1..10}, po prostu tworzy nazwę katalogu {1..10}.

użytkownik43312
źródło
mkdir {1..10}działa dla mnie, tworzy dziesięć reż.
podejrzany
2
Radzę dodać, echo ${SHELL}aby to pytanie było w stanie uzyskać przydatną odpowiedź.
dn

Odpowiedzi:

11

Podczas gdy ekspansja nawiasów klamrowych {1,2}pochodzi cshz późnych lat 70. i trafiła do podobnych do Bourne'a pocisków w bash/ zsh/ pdkshpod koniec lat 80., na początku lat 90., {n1..n2}wariant pojawił się później zshw 1995 r. (2.6-beta4).

bashskopiowałem go w 2004 r. (3.0) i ksh93w 2005 r. ( ksh93r).

Prawdopodobnie powłoka, w której próbujesz tego użyć, nie jest żadną z nich lub jest starszą wersją bashi ksh93.

Stéphane Chazelas
źródło
Powinniśmy zastanowić się, jakiego rodzaju skorupy użył. / ja podejrzewa, że ​​to #!/bin/sh...
polemon
3
@polemon, To niekoniecznie pomogłoby. Na przykład w niektórych systemach /bin/shjest bashlub ksh93.
Stéphane Chazelas
2
Właściwie myślę, że tak: w zależności od wywołania, wywoływane powłoki /bin/sh działają jako historyczne sh(tak zresztą mówi strona podręcznika bash). Nie sprawdziłem kshstrony podręcznika użytkownika, ale jestem pewien, że będzie się odpowiednio zachowywać.
polemon
1
@ user43312: dlaczego nadal używasz RH9? Przez wiele lat nie był utrzymywany. Jak napisał Stephane, jest to funkcja ostatnich wersji bash. Więc jest bardzo mało prawdopodobne, że twoja wersja bash obsługuje to. Możesz sprawdzić wersję za pomocą bash --version. I dla pewności sprawdź, czy używasz powłoki bash, sprawdzając zmienną $ SHELL lub po prostu ps. Aby skorzystać z tej funkcji, możesz najpierw spróbować uruchomić powłokę zsh ( zsh). Innym obejściem byłoby użycie czegoś takiego jak „mkdir $ (seq 1 10)”.
Bram
1
@polemon Zachowanie startowe innej powłoki (tzn. które pliki pobiera podczas uruchamiania), a nie naśladowanie innej powłoki.
Chris Down,
4

{x..y}Rozszerzenie zakresu nawiasów jest zaimplementowane w bash 3.0-alpha. Aby pomóc nam i sobie, pokaż swoje echo "$BASH_VERSION"wyniki.

Następnie odpowiedź: Jeśli mkdir {1..10}tworzy katalog z nazwą {1..10}, to wcześniej używasz wersji bash bash 3.0-alpha. W takim przypadku można użyć konstrukcji pętli for:

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

Valentin Bajrami
źródło
1

Sprawdź swoją wersję 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>

Sprawdź również, czy mkdirnie były to aliasy w jakiś dziwny sposób:

$ alias |grep mkdir
alias md='mkdir'
slm
źródło