Portál AbcLinuxu, 4. května 2025 17:27
Vypadá to, že při vypnutém extglob
se shell nejdřív konstrukci s vykřičníkem interpretovat jako "event" (viz history expansion), takže je syntakticky špatně a žádný příkaz (tj. ani shopt
) se neprovede.
Že se tak chová i ta první varianta, může možná vypadat trochu překvapivě, ale všimněte si, že když to budete takhle po řádcích zadávat interaktivně, shell stejně nezačne žádný příkaz provádět, dokud nemá podmíněný příkaz kompletní.
Zajímavější je tohle:
~> shopt -s extglob ~> if shopt -u extglob && echo dir/!(dir2); then echo OK; fi dir/!(dir2) OK
Tady se díky zapnutému extglob obejde history expansion, ale než se skutečně provede druhý podpříkaz, shopt
mezitím extglob
vypne, takže se konstrukce neexpanduje.
Aha. Čize interpreter skôr než začne vykonávať príkazy za if
skontroluje syntax a vyhodí chybu skôr, ako čokoľvek vykoná. Tomu nasvedčuje aj Váš názorný príklad. Vďaka.
Prečo ale vyhadzuje chybu syntaxe a nie klasické event not found
? Tiež som si teraz všimol, že interaktívne mám extglob
zapnutý by default (Archlinux - nepamätám, že by som to zapínal, čiže predpokladám, že default), ale v skripte je to vypnuté?
Prečo ale vyhadzuje chybu syntaxe a nie klasické event not found?
Aha, neuvědomil jsem si, že to pouštíte jako script. Neinteraktivní shell nezná history expansion, takže tím se z toho stane prostá syntaktická chyba.
Tiež som si teraz všimol, že interaktívne mám extglob zapnutý by default (Archlinux - nepamätám, že by som to zapínal, čiže predpokladám, že default), ale v skripte je to vypnuté?
Pravděpodobně to "defaultně zapnuté" znamená, že se to zapíná někde v ~/.bashrc
nebo /etc/bash.bashrc
, který neinteraktivní shell nenačítá. (A shell options se nedědí.)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.