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