Comando Linux para listar todos os comandos e aliases disponíveis

280

Existe um comando Linux que listará todos os comandos e aliases disponíveis para esta sessão do terminal?

Como se você tivesse digitado 'a' e pressionado tab, mas para todas as letras do alfabeto. Ou executando 'alias', mas também retornando comandos.

Por quê? Eu gostaria de executar o seguinte e ver se um comando está disponível:

ListAllCommands | grep searchstr
ack
fonte
pressione o botão TAB duas vezes para listar todos os comandos disponíveis com o ambiente
ntshetty

Respostas:

599

Você pode usar o bash (1) embutido compgen

  • compgen -c listará todos os comandos que você pode executar.
  • compgen -a listará todos os aliases que você pode executar.
  • compgen -b listará todos os built-ins que você pode executar.
  • compgen -k listará todas as palavras-chave que você pode executar.
  • compgen -A function listará todas as funções que você pode executar.
  • compgen -A function -abck listará todos os itens acima de uma só vez.

Verifique a página de manual para outras conclusões que você pode gerar.

Para responder diretamente à sua pergunta:

compgen -ac | grep searchstr

deve fazer o que você quiser.

camh
fonte
1
Existe um equivalente a isso para csh / tcsh? Esses terminais também têm algum tipo de função de preenchimento automático usada na guia, então talvez exista algo?
krb686
2
Em vez de compgen | grep, pode ser mais eficiente passar a string como argumento para compgensi mesma (se for um prefixo, como está implícito na pergunta). Nesse caso, isso seria compgen -ac searchstr.
precisa
Na verdade, o ubuntu mostra 'nada apropriado' whatis compgene 'Nenhuma entrada manual' para man compgen.
MarAvFe 23/08
1
@MarAvFe: Isso é porque é um bashcomando interno , não um comando separado, com sua própria página de manual. Você precisará ler a bash(1)página do manual ou executar help compgenem uma bashlinha de comando.
Camh
Por extensão, doing compgen -c | sort | uniq | lessimprimirá todos os comandos disponíveis sem linhas duplicadas e classificados em ordem alfabética.
Fabián
39

Adicionar ao .bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

Se você também quiser aliases, então:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}
Formigas Aasma
fonte
Isso é muito próximo, mas não inclui aliases. Como posso acrescentar um alias | cortar -f1 para os resultados, mas antes da classificação?
ack
1
Por que se preocupar em classificar se o único objetivo é colocar a saída através do grep? A filosofia do Unix é criar ferramentas simples e, em seguida, encadeá-las, se necessário, portanto, deixe de fora a ListAllCommands e, se o usuário desejar a saída classificada, poderá fazer isso.
Danio
4
A classificação é para remover duplicatas.
Formigas Aasma
1
Isso não encontra comandos que são links simbólicos para executáveis. Use a opção -Lpara seguir links simbólicos para o destino. Nota: -Lé uma opção e não faz parte da expressão correspondente; portanto, ela deve ser colocada antes do caminho na linha de comando. Neste casofind -L {}
Adaephon
1
Pode querer redirecionar STDERR para / dev / null para suprimir avisos de diretório inexistentes. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 para compatibilidade com zsh)
TheLonelyGhost
27

Existe o

type -a mycommand

comando que lista todos os aliases e comandos em $ PATH onde mycommand é usado. Pode ser usado para verificar se o comando existe em várias variantes. Fora isso ... Provavelmente existe algum script que analisa $ PATH e todos os aliases, mas não conhece nenhum script desse tipo.

sunny256
fonte
1
Mesmo que não seja uma resposta para a pergunta, acho que é uma solução melhor para o problema do que o chamado para grep. Então você pode digitar -a foo e se foo não estiver disponível, ele retornará o comando não encontrado ou algo parecido. Portanto, você pode procurar um comando sem chamar o próprio comando.
Janusz
1
Na verdade, é uma resposta para a pergunta, pois o OP perguntou: "Gostaria de executar o seguinte e ver se um comando está disponível"; portanto, o objetivo é verificar se um comando está disponível e essa resposta funciona claramente.
Lothar
2
@ lothar, e se o comando que você estiver procurando for, uh, qual foi, "runserver" ?, "serverstart" ?, "server-something-or-other" ?. Eu sei, vou apenas "grep -i" para servidor e ver se está lá. Opa Bzzz, não com esta solução. matey :-) Não vou votar nesta resposta (já que é útil mesmo que de forma limitada), mas uma solução completa levaria em conta que grep é para expressões regulares , não apenas para cadeias de caracteres fixas.
paxdiablo
6

Use "what searchstr". Retorna o caminho da configuração binária ou do alias, se for um alias

Editar: se você estiver procurando por uma lista de aliases, poderá usar:

alias -p | cut -d= -f1 | cut -d' ' -f2

Adicione isso à resposta que você procura no CAMINHO. Supõe que você esteja usando o bash ..

Aaron
fonte
6

O comando others não funcionou para mim em sistemas embarcados, porque eles exigem o bash ou uma versão mais completa do xargs (o busybox era limitado).

Os seguintes comandos devem funcionar em qualquer sistema semelhante ao Unix.

Listar por pasta:

ls $(echo $PATH | tr ':' ' ')

Listar todos os comandos por nome

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort
Olivier Lasne
fonte
Isso ainda depende tr. Por que não simplesmente ls $(echo ${PATH//:/ })?
mschilli 3/06
5

Experimente este script:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done
Victor Hugo
fonte
Até agora, esta é a única solução de código que faz isso para todos os comandos, não apenas para ver se existe um comando conhecido. +1.
paxdiablo
3

Para usuários de Mac ( find não possui -executable e xargs não--d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'
cofre
fonte
Obrigado por isso. Na verdade, estou usando um unix não-Mac, onde a resposta @AntsAasma não funcionou. Isso funciona para mim no mac e no meu unix também. Qual comando posso digitar para determinar a versão do unix em que estou, para poder responder aqui para ajudar outras pessoas com o meu problema?
Prismaticorb
Linux <corporate_proprietary_build_info_here> Mon 12 de dezembro 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb
3

É útil listar os comandos com base nas palavras-chave associadas ao comando.

Usar: man -k "your keyword"

fique à vontade para combinar com:| grep "another word"

por exemplo, para encontrar um editor de texto: man -k editor | grep text

Passarinho
fonte
2

Tente pressionar ALT-? (alt e ponto de interrogação ao mesmo tempo). Dê um ou dois segundos para criar a lista. Deve funcionar no bash.

Igor Krivokon
fonte
3
Ou tente pressionar Esc no início de uma linha em branco quatro vezes.
ephemient
Isso é incrivelmente útil, e eu já não soubesse que graças :-)
Chris Huang-Leaver
2

Aqui está uma solução que fornece uma lista de todos os executáveis e aliases. Também é portátil para sistemas sem xargs -d(por exemplo, Mac OS X) e lida adequadamente com caminhos com espaços neles.

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

Uso: myscript.sh [grep-options] patternpor exemplo, para encontrar todos os comandos que começam com lsmaiúsculas de minúsculas, faça:

myscript -i ^ls
Adam Rosenfield
fonte
2

método de atalho para listar todos os comandos. Abra o terminal e pressione duas vezes o botão "tab" . Isso mostra todos os comandos no terminal

denny
fonte
1
E você coloca isso grepexatamente como?
precisa
2

Como alternativa, você pode obter uma lista conveniente de comandos, juntamente com descrições rápidas (desde que o comando tenha uma página de manual, o que a maioria possui):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

Então você apenas o cumprimenta como deseja.

apropos -s 1 '' | grep xdg

rendimentos:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

Os resultados não parecem classificados, portanto, se você estiver procurando por uma lista longa, poderá lançar um | classificar | no meio e, em seguida, canalize-o para um pager como menos / mais / mais. ala:

apropos -s 1 '' | sort | grep zip | less

O que retorna uma lista ordenada de todos os comandos que possuem "zip" em seu nome ou em sua breve descrição e bombeia esse pager "less". (Você também pode substituir "less" por $ PAGER e usar o pager padrão.)

Katastic Voyage
fonte
1

Você pode sempre o seguinte:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

O shell executará o comando somente se eles estiverem listados no caminho env var de qualquer maneira.

OscarRyz
fonte
1

depende, com isso quero dizer que depende de qual shell você está usando. Aqui estão as restrições que eu vejo:

  1. deve ser executado no mesmo processo que seu shell, para capturar aliases e funções e variáveis ​​que afetariam os comandos que você pode encontrar, pense em PATH ou EDITOR, embora o EDITOR possa estar fora do escopo. Você pode ter variáveis ​​não exportadas que podem afetar as coisas.
  2. é específico do shell ou você está entrando no kernel, / proc / pid / enviorn e amigos não têm informações suficientes

Eu uso o ZSH, então aqui está uma resposta do zsh, ele faz as seguintes 3 coisas:

  1. despejo caminho
  2. despeja nomes alternativos
  3. despeja funções que estão no ambiente
  4. classifica-os

Aqui está:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

Se você usa o zsh, deve fazê-lo.

ms4720
fonte
0

O problema é que a conclusão da guia está pesquisando seu caminho, mas nem todos os comandos estão no seu caminho.

Para encontrar os comandos no seu caminho usando o bash, você pode fazer algo como:

para x in echo $PATH | cut -d":" -f1; faça $ x; feito

nikudesu
fonte
0

Aqui está uma função que você pode colocar no seu arquivo bashrc:

função comando-procura
{
   oldIFS = $ {IFS}
   IFS = ":"

   para p em $ {PATH}
   Faz
      ls $ p | grep $ 1
   feito

   exportar IFS = $ {oldIFS}
}

Exemplo de uso:

$ comando-pesquisa gnome
gnome-audio-profiles-properties *
gnome-eject @
chaveiro gnomo *
gnome-chaveiro-daemon *
montagem no gnomo *
gnome-aberto *
gravador de som gnomo *
editor de texto gnome @
gnome-umount @
controle de volume gnome *
autorização polkit-gnome *
vim.gnome *
$

FYI: IFS é uma variável que o bash usa para dividir seqüências de caracteres.

Certamente, poderia haver algumas maneiras melhores de fazer isso.

Craig Wright
fonte
-1

Talvez eu esteja entendendo errado, mas e se você pressionar Escape até ter as possibilidades Exibir todos os X?

LB40
fonte
-2
compgen -c > list.txt && wc list.txt
some1
fonte
1
Considere adicionar uma breve descrição do que isso faz ou como isso deve funcionar. No mínimo, especifique um link de referência (geralmente a página de manual relevante) para acompanhar e entender a solução proposta.
TheCodeArtist
Usar um arquivo nem sempre é uma boa opção. Se você precisa fazer para, em seguida, pelo menos, torná-lo um arquivo tmp (se a segurança não é um problema.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary
-3

Por que você não digita apenas:

seachstr

No terminal.

A concha dirá algo como

seacrhstr: command not found 

EDITAR:

Ok, entendi o voto negativo, porque a resposta é estúpida, só quero saber: o que há de errado com esta resposta !!! O autor da pergunta disse:

e veja se um comando está disponível.

Digitar o comando dirá se ele está disponível !.

Provavelmente, ele / ela quis dizer "sem executar o comando" ou "incluí-lo em um script", mas não consigo ler sua mente (não é que não possa regularmente, é apenas que ele está usando um defletor de leitura da mente )

OscarRyz
fonte
4
Eu quero saber se o formathddcomando existe. Oh espere, eu apenas para executá-lo e ver. caramba. Obrigado :)
Jeffrey Jose
5
Provavelmente é mais seguro usar 'what' para fazer isso.
Danio
Dado que esse é Stack Overflow , não Super User , uma resposta programática seria mais apropriada.
precisa
-5

no debian: ls / bin / | grep "whatImSearchingFor"

Gabriel Sosa
fonte
1
existem executáveis ​​em todos os diretórios em $ PATH, não apenas em / bin.
PhrkOnLsh