Script compgen para ver uma breve descrição dos comandos instalados no sistema

Fiz este script para facilitar a procura de comandos por descrição.
Usa o comando compgen para capturar todos os comandos.
Sobre compgen:
Para opções [abcdefgjksuv]:

  • -a significa nomes de alias
  • -b significa nomes de shell builtins
  • -c significa nomes de todos os comandos
  • -d significa nomes do diretório
  • -e significa nomes de variáveis ​​de shell exportadas
  • -f significa nomes de arquivo e funções
  • -g significa nomes de grupos
  • -j significa nomes de trabalho
  • -k significa nomes de palavras reservadas da Shell
  • -s significa nomes de serviço
  • -u significa nomes de nomes de userAlias
  • -v significa nomes de variáveis ​​de shell

manual: Programmable Completion Builtins (Bash Reference Manual)

Usa whatis para capturar as descrições…

#!/bin/bash
echo "Criando arquivo temporário"
comandos=($(compgen -c))
lista_comandos=($(which "${comandos[@]}" 2>/dev/null |awk -F/ '{print $NF}'))

conta=0
while [  $conta -lt "${#lista_comandos[@]}" ]; do
  whatis "${lista_comandos[$conta]}"| sed -e 's/ - //g' -e's/([0-9]*.)/:/g'|head -1 
   let conta=conta+1 
done &>> resumo.txt

echo "Criando lista de comandos com breve resumo"
cat resumo.txt|grep -vi "nada apropriado"|sort|uniq > breve_resumo.txt
echo "Criando lista de comandos sem resumo"
cat resumo.txt|grep -i "nada apropriado"|awk -F: '{print $1}'|sort|uniq > sem_resumo.txt

echo "Removendo arquivo temporário"
rm -f "resumo.txt"
echo "Aquivos criados: breve_resumo.txt, sem_resumo.txt"

Quem quiser modificar ou melhorar o o script é só adicionar aqui

exemplo da saída:

5 curtidas

Propondo uma versão sem arquivos temporários:

comandos=($(which $(compgen -c) 2>/dev/null) )
# Achar os "final" dos comandos
comandos=( "${comandos[@]##*/}" )

for comando in "${comandos[@]}"; do
# Fazendo o "head" direto no `sed` (q - abortar)
whatis "$comando" 2>&1 | sed -e 's/ - //g' -e 's/([0-9]*.)/:/g' -e 'q'
done | tee \
    >(grep -vi 'nada apropriado' | sort -u > breve_resumo.txt) |
    grep -i 'nada apropriado'  | awk -F: '{print $1}' | sort -u > sem_resumo.txt

echo "Aquivos criados:"
echo "breve_resumo.txt (comandos com breve resumo)"
echo "sem_resumo.txt (comandos sem resumo)"
Versão não-Bash
#!/bin/sh

# Dividir variáveis em ':'.
IFS=:
# Ignorar *, ?, etc. (temporariamente)
set -f
# Os comandos ficam no $PATH. Achá-los e organizá-los (sort)
for folder in $PATH; do
	# Ignorar pastas não existentes que por algum motivo estejam no path.
	[ -d "$folder" ] || continue
	# Voltar a interpretar *, ?, etc.
	set +f
	for file in "$folder"/*; do
		# Ignorar arquivos que não forem executáveis
		[ -x "$file" ] || continue
		# Emitir o nome do arquivo para o próximo estágio (xargs)
		echo "${file##*/}"
	done
done | sort |
# Obter descrições dos programas achados no estágio anterior.
# 2>/dev/null ignora mensagens de erro e "nada apropriado"
xargs -d'\n' whatis 2>&1 |
# Fazer a lista final.
awk '
BEGIN {
	# Dividir as listagens no -.
	FS=" - "
}
{
	# Remover (1), (1p), (1perl), etc.
	gsub("\([0-9]+[^)]*\)","",$1)
	# Remover espaços em branco
	gsub("[[:blank:]]*$","",$1)
	if ($1 == ultim_comando) {
		# Ignorar descrições repetidas
	} else {
		# Emitir o resumo, e direcioná-lo ao arquivo apropriado.
		if (match($2, ".*nada apropriado.*")) {
			# Nada apropriado.
			print $1 >> "sem_resumo.txt"
		} else {
			print $1 ":" $2 >> "breve_resumo.txt"
		}
		# Passar a ignorar esse comando
		ultim_comando = $1
	}
}'
echo "Aquivos criados:"
echo "breve_resumo.txt (comandos com breve resumo)"
echo "sem_resumo.txt (comandos sem resumo)"
2 curtidas