Em qualquer shell POSIX, sem usar nenhum comando externo (assumindo que printf
esteja embutido, se não retornar a echo
), exceto para a classificação final, e assumindo que nenhum nome executável contenha uma nova linha:
{ set -f; IFS=:; for d in $PATH; do set +f; [ -n "$d" ] || d=.; for f in "$d"/.[!.]* "$d"/..?* "$d"/*; do [ -f "$f" ] && [ -x "$f" ] && printf '%s\n' "${x##*/}"; done; done; } | sort
Se você não tiver nenhum componente vazio em $PATH
(use .
) nem componentes começando com -
, nem caracteres curinga \[?*
em componentes PATH ou nomes executáveis e nenhum executável começando com .
, você pode simplificar isso para:
{ IFS=:; for d in $PATH; do for f in $d/*; do [ -f $f ] && [ -x $f ] && echo ${x##*/}; done; done; } | sort
Usando POSIX find
e sed
:
{ IFS=:; set -f; find -H $PATH -prune -type f -perm -100 -print; } | sed 's!.*/!!' | sort
Se você estiver disposto a listar o arquivo não executável ou o arquivo não regular no caminho, há uma maneira muito mais simples:
{ IFS=:; ls -H $PATH; } | sort
Isso ignora os arquivos de pontos; se você precisar deles, adicione o -A
flag a ls
se o seu tiver, ou se você quiser ficar com POSIX: ls -aH $PATH | grep -Fxv -e . -e ..
Existem soluções mais simples no bash e no zsh .