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 package
gera 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.