( Zahy | 2024. 05. 31., p – 22:00 )

Hát pl. mert az az egyetlen, ami képes értelmezni a .sig -emet :-)

De amúgy zellernek igaza van, a hordozhatóságot próbáltam hangsúlyozni.

Hülyét tudok kapni attól, hogy a bash-fejlesztők - nagyjából totál értelmetlenül - olyasmiket is belefejlesztettek, ami kb. csak arra volt jó, hogy könnyen lehessen inkompatibilis kódot írni. Tehát nem arról beszélek, ami náluk lett először (vagy csak náluk van azóta is egyedül), hanem arról, amikor a Ksh-ban már évek (évtizedek) óta meglevő funkciókat implementáltak inkompatibilis módon. Ide tartozik ez a declare / typeset (kb. csak annyit kellett volna, hogy nem a declare formát hangsúlyozni mindenhol, hanem a typeset-et). Ilyen a függvények kezelése: kezdetben vala az x() forma, aztán a ksh-ban bevezették e mellé a function x formát, majd a bash fejlesztők kitalálták azt, hogy akár function x() formában is lehessen írni. (Eredménye, nagyon sok kódban szerepel ez az utóbbi forma.) De ilyen a . parancs C-shellesítése source néven. Vagy éppen a ksh-ban set -A array 1 2 3 formában bevezetett tömbváltozó kezelés helyett bevezetett array=( 1 2 3 ) forma. (De ha a typeset-nél és a .-nál van másik - kompatibilis - forma, akkor pont ezt miért nem vették át ugyanígy, hogy legyen jó mind a 2 szintaxis????) Vagy ahogy a Ksh-ban bevezetett aritmetikai helyettesítés - azaz a $(( 5 * 3 )) formát átvették, de azért mellécsapták (és promótálják, hogy ezt javasolt használni) helyette a $[ 5 * 3 ] formát. De hasonlóan, kb. 25 évvel a ksh után, bash-ban is megjelent a koprocessz kezelés lehetősége - és puff, egy teljesen a ksh-étól eltérő szintaxissal, még csak könnyedén átírni sem lehet. (ksh: p |& és utána read -p / echo -p szolgál a kommunikációra; bash-ban coproc kulcsszó, és egy, a koprocessz nevével megegyező nevű tömbváltozó 0-s és 1-s indexű elemén keresztül elérhető pipe-ok.)

A furcsa, hogy a bash doksikban egyértelműen benne van, hogy az un. POSIX-shell egy implementációjáról van szó. Azt pontosan lehet tudni, hogy a POSI-shell mint olyan pedig az akkor már évek óta létező (ksh88-as verziójú) Korn-shell alapján lett kitalálva (itt-ott módosításokkal) - no akkor ugyan miért nem lehetett a POSIX-shellben nem deklarált - de a ksh-ban létező funkciók újraimplementálásakor tartani a "őssel" a kompatibilitást.

Valószínűleg még lehetne találni pár ilyet - azaz olyat, ahol a "világuralomra törekvés" kivételével nem nagyon találni épelméjű magyarázatot a "miért így"-re.

 

(Ja, elvetemültebbek elkezdhetnek játszani a yash-sal - ami öndefiníciója szerint: a POSIX-compliant command line shell - persze nem 100%-ig kompatibilis se a ksh-val, se a bash-sal, se a zsh-val.)

-- 
#!/bin/ksh
Z='21N16I25C25E30, 40M30E33E25T15U!';IFS=' ABCDEFGHIJKLMNOPQRSTUVWXYZ ';
set -- $Z;for i;{ [[ $i = ? ]]&&print $i&&break;[[ $i = ??? ]]&&j=$i&&i=${i%?};
typeset -i40 i=8#$i;print -n ${i#???};[[ "$j" = ??? ]]&&print -n "${j#??} "&&j=;
typeset +i i;};IFS=' 0123456789 ';set -- $Z;
for i;{ [[ $i = , ]]&&i=2;[[ $i = ?? ]]||typeset -l i;j="$j $i";typeset +l i;};print "$j"