O pequeno loop a seguir lidará com isso com pacotes instalados .
$ for f in $(dpkg -L login); do [[ $(type -P "${f##*/}") == "$f" ]] && echo ${f##*/}; done
nologin
lastlog
newgrp
faillog
su
login
sg
Como funciona:
-
dpkg -L packagegera uma lista de todos os arquivos em um pacote pelo qual nós iteramos. - Retiramos o nome do diretório com um pouco de conhecimento básico:
${f##*/}e - Usando o bash-builtin
type -P command, vemos se esse comando está no caminho e que seu caminho é igual ao arquivo com o qual começamos. - Terminamos enviando o comando abreviado.
-
[[ condition ]] && commandé apenas uma abreviação de uma declaração if..then.
É importante notar que nem todos os pacotes contêm os comandos esperados. O Apache é dividido em vários pacotes (com -common e -bin subpackages) e o comando vlc não está no pacote vlc , está em vlc-nox . Existem muitos exemplos como esse.
Isso pode ser adaptado por idéia de Gilles , fazendo uma correspondência de string em vez de realmente verificar, mas mantendo tudo em um processo bash (e ainda usando o caminho todo ).
for f in $(dpkg -L login); do [[ $f =~ ^${PATH//:/|} ]] && echo ${f##*/}; done
A principal diferença aqui é o [[$f =~ ^${PATH//:/|} ]] . Essa é uma pesquisa regex em Bash. A parte ${PATH//:/|} está pegando o conteúdo de $ PATH e os está cortando em um pequeno regex sujo. A condição deve verificar se a string começa com parte do caminho.