O CMD output por ps é o nome do processo ou os argumentos passados para o comando (incluindo o primeiro argumento argv[0] ). Embora tenha alguma relação com o caminho do executável, não há garantias de que eles estejam vinculados.
No Linux:
print -r -- /proc/self/exe(:A)
Em Darwin e Linux e possivelmente em outros:
lsof -ap"$$" -dtxt -Fn | sed '2!d;s/.//;q'
Mas não sei como é confiável.
Outra heurística:
print -r -- ${${0#-}:c:A}
$0 , como você vê na saída do ps contém o primeiro argumento que zsh recebeu ( argv[0] ), ou quando passou um script como argumento, esse argumento.
No primeiro caso, normalmente (por convenção, não há garantia) que argv[0] seria um caminho incluindo / (relativo ou absoluto) ou zsh ( algo sem / ). Nesse caso, o chamador terá pesquisado zsh em his $PATH ou sua tabela de hash de comando ... Se o caminho for relativo, o método acima funcionará apenas se o diretório atual não foi alterado desde que o zsh foi chamado. Se não houver / , o método só funcionará se zsh estiver procurando o executável da mesma forma que o chamador.
No caso de um script, é o caminho do script que será retornado em vez daquele do interpretador (ao contrário das duas primeiras soluções).