Jaki jest identyfikator tokena `]`?

9

Bash Manual mówi:

Gdy używany jest [formularz, ostatnim argumentem polecenia musi być a].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Nie ]jest to więc słowo zastrzeżone, ani operator, ani wbudowane polecenie.

Jako token, jaki jest identyfikator tokena ]? SŁOWO czy NAZWA?

Tim
źródło
4
W rzeczywistości [jest (także) samowystarczalną komendą: -rwxr-xr-x 1 root root 39552 Dec 3 18:14 / usr / bin / [Chociaż jest to możliwe, istnieje również wbudowane „równoległe”, tak jak w przypadku na przykład kill. W niektórych systemach testpolecenie jest dowiązaniem symbolicznym [lub odwrotnie. AFAIK, ]samo w sobie nic nie znaczy, ale przyjmuje się, że „zamyka” a [- ale bardziej z „estetycznego” powodu.
Baard Kopperud
5
Język powłoki rozwijał się warstwa po warstwie w ciągu ostatnich 46 lat, a spójność wewnętrzna nigdy nie była priorytetem. Jeśli spróbujesz przymusowo dopasować go do jakiegokolwiek teoretycznego frameworka języka formalnego, będziesz miał zły czas.
zwolnienie
Ponieważ [jest (także) samodzielnym poleceniem, zwykle ma stronę man ... Więc spróbuj man [i / lub man test( [i testmoże to być to samo polecenie).
Baard Kopperud
Spróbuj wstawić ]pojedyncze lub podwójne cudzysłowy, a zobaczysz, że to nie ma znaczenia; to tylko struna.
Wildcard

Odpowiedzi:

21

]uzupełnia [, jest to zamykający znak [polecenia.

Jak manwskazuje strona, jest to w rzeczywistości argument [, ale [traktuje się go szczególnie jako zakończenie.

Możesz to przypominać za pomocą innych wzorców zamykania poleceń, na przykład ;w find .. exec.

heemayl
źródło
Dzięki. Jaki jest typ / identyfikator tokena ]?
Tim
8
@Tim ]nie różni się niczym od innych normalnych znaków w tym kontekście (jako argument polecenia). Że testtraktuje ją specjalnie, ale to się do komend.
muru
6
Jest to tylko ciąg znaków i [powoduje błąd, jeśli jego końcowy argument nie jest dokładnie równy ].
chepner
19

Bash nie traktuje znaków [lub ](samych) inaczej niż litery alfabetu.

W tym przypadku bash widzi „słowo” [i szuka polecenia o tej nazwie. Jeśli spojrzysz na swój system plików, prawdopodobnie zauważysz, że /bin/[(lub /usr/bin/[) istnieje jako plik wykonywalny. Tak się składa, że ​​bash zapewnia również wbudowaną wersję (ze względu na wydajność), ale to tylko szczegół implementacji.

[Polecenia (jak w plik wykonywalny o takiej nazwie), ma zasadę, że ostatni parametr przekazać do należy ]albo zgłasza błąd. Może to częściowo wynikać z tego, że jest estetyczny, ale służy również do ochrony przed przypadkowo obciętymi poleceniami, co jest miłe.

Fakt, że nieone wyjątkowe, powoduje, że nie można pominąć białej przestrzeni przed i po [lub ].


Wyjątki :

  • Kiedy [i ]występują we właściwym formacie w tym samym słowie, np. [a-z]Wtedy jest to specjalne i obowiązują zasady globowania bash.
  • [[Komenda jest wyjątkowy i może zrobić wiele rzeczy [nie może (i parametry wewnątrz [[ .. ]]są przetwarzane w inny sposób, jak są jakieś podziały wiersza). Odpowiednie ]]jest również specjalne, ponieważ jest słowem zastrzeżonym w powłoce, które nie może być nazwą polecenia, i kończy specjalne przetwarzanie następujące po [[słowie kluczowym.
ams
źródło
1
@JacobKrall To nie jest jak znak specjalny ;lub >, po prostu wbudowanym poleceniem cd. W szczególności, jeśli wpiszesz [x, [nie ma specjalnego znaczenia.
Barmar
2
@JacobKrall Dotyczy to wszystkich wbudowanych poleceń. [to polecenie specjalne , nie jest to znak specjalny .
Barmar
@Barmar: Wystarczająco; Cofam swoje komentarze.
Jacob Krall,
W rzeczywistości ]]jest bardziej wyjątkowy niż ]. Podczas używania [i ]są to tylko słowa. Jeśli pominiesz ]lub zastąpisz je innym słowem, bash nadal będzie działał [, ale [spowoduje błąd. Jednak [[i ]]są traktowane specjalnie na czas parsowania. Jeśli zastąpiłeś ]]coś innego, bash zgłosi błąd składniowy. A jeśli pominiesz, ]]bash będzie parsował następną linię w poszukiwaniu ]].
kasperd
Odpowiedź @kasperd dostosowana.
popr.
3

Mówiąc prościej niż dwie poprzednie odpowiedzi, ]jest to tylko ciąg, który [wymaga uruchomienia.

Kenny
źródło
1
To wydaje się trochę jak komentarza ...
wizzwizz4
@ wizzwizz4, biorąc pod uwagę dalsze pytania z OP w komentarzach, myślę, że ta prostota jest dokładnie tym, czego potrzebował.
Wildcard
@Wildcard Zgadzam się. Było coś, co kusiło mnie do poparcia tej odpowiedzi, ale myślałem, że jest niskiej jakości. (Nie głosowałem jednak za negatywnie!) Będę edytować, aby poprawić znaczniki.
wizzwizz4