I have this customisation (setq dired-guess-shell-alist-user '(("." EXP))) where EXP evaluates to a list of strings. It has been working for ~10 years until Emacs 28. After some digging it turns out there is a rewrite of `dired-guess-default' which is not compatible. Previously returning a list of strings from EXP accidentally worked. (eval (car cmds) `((file . ,file))) ; single command but if it evaluates to a list of strings it is perfectly fine as per the documentation of dired-guess-default. I propose the following patch for remedy.