Kiedy wpisujesz
./skrypt Linux traktuje ten plik jako plik programu. Po dwóch znakach na początku
#! rozpoznaje iż jest to skrypt powłoki i próbuje uruchomić interpreter dla danego skryptu (podany w pierwszej linii, u ciebie zapewnie jest: #!/usr/bin/ksh). Nie masz zainstalowanego ksh, więc stąd ten błąd.
Z kolei uruchamiając skrypt przez
. ./skrypt mówisz powłoce iż w pliku tym jest skrypt, który powinien wykonać; żaden proces nie jest uruchamiany a bieżąca powłoka próbuje wykonać zawarty w pliku skrypt (bez uruchamiania kolejnego procesu). Doskonały przykład który zobrazuje całą sytuację:
Skrypt ten wyświetli ID bieżącego procesu; jeżeli wywołasz go w "pierwszy" sposób, za każdym razem dostaniesz inną wartość (uruchamiany jest nowy proces powłoki), zaś przy wywołaniu drugim sposobem cały czas będziesz otrzymywał tą samą wartość - ID powłoki, na której obecnie pracujesz.