Listar todos os comandos que um shell conhece


32

O que posso digitar no meu shell (que acontece bash) que listará todos os comandos que são reconhecidos?

Além disso, isso difere por shell? Ou todos os shells têm apenas um "diretório" de comandos que reconhecem?

Em segundo lugar, pergunta diferente, mas como posso substituir qualquer uma dessas? Em outras palavras, como posso escrever meu próprio viewcomando para substituir o existente no meu sistema Ubuntu, que parece apenas carregar vim.


5
Por favor, não combine perguntas. Poste cada uma como uma pergunta separada.
terdon

Quase duplicar de unix.stackexchange.com/q/63073/135943 (Tenho ligado em ambas as direções.)
Wildcard

Respostas:


61

Você pode usarcompgen

compgen -c # will list all the commands you could run.

PARA SUA INFORMAÇÃO:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
Observe que compgen -cincluirá coisas como {ou whileque não são comandos estritamente falando.
Stéphane Chazelas

13

Um shell conhece quatro tipos de comandos.

  • Alias: são apelidos para um comando com algumas opções. Eles são definidos no arquivo de inicialização do shell ( ~/.bashrcpara bash).
  • Funções: são trechos de código shell que recebem um nome. Como aliases, eles são definidos no arquivo de inicialização do shell.
  • Builtins: o shell vem com um pequeno número de comandos embutidos. A maioria dos builtins manipula o estado do shell ( cdaltera o diretório atual, setaltera opções e parâmetros posicionais, exportaltera o ambiente, ...). A maioria dos shell oferece basicamente os mesmos recursos internos, mas cada shell possui algumas extensões para o conjunto básico.
  • Comandos externos: eles são independentes do shell. Como outros programas, o shell executa programas externos procurando-os no caminho da pesquisa executável . A PATHvariável de ambiente contém uma lista de diretórios separados por dois pontos para procurar programas.

Caso existam comandos de vários tipos com o mesmo nome, a primeira correspondência na ordem acima é executada¹.

Você pode ver a que tipo de comando um nome corresponde executando type some_name.

Você pode listar aliases executando o aliasbuilt-in sem argumento. Não há como listar funções ou componentes internos que funcionem em todos os shells. Você pode encontrar uma lista de componentes internos na documentação do shell.

No bash, o setbuilt-in lista funções com suas definições e variáveis. No bash, ksh ou zsh, typeset -flista funções com suas definições. No bash, você pode listar todos os nomes de comandos de qualquer tipo compgen -c. Você pode usar compgen -A alias, compgen -A builtin compgen -A functionpara listar comandos de um tipo específico. Você pode passar uma sequência adicional compgenpara listar apenas os comandos que começam com esse prefixo.

Em zsh, você pode listar os comandos disponíveis atualmente de um determinado tipo com echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}e echo ${(k)commands}(apenas essa última lista os comandos externos).

O seguinte snippet independente de shell lista todos os programas externos disponíveis:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Há um caso de borda no Bash: comandos de hash.

O Manual de Referência do Bash diz:

Uma pesquisa completa dos diretórios em $ PATH é executada apenas se o comando não for encontrado na tabela de hash

Experimentar:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

A PATHvariável de ambiente não contém ~/dir-for-wat-command, compgen -cnão aparece wat, mas você pode executar wat.

Se você deseja sombrear um comando existente, defina um alias ou uma função .

Ception Exceção: alguns built-in (chamados built-in especiais ) não podem ser sombreados por uma função - o bash e o zsh não estão de acordo com o POSIX nesse ponto no modo padrão.


Outro caso de borda é para valores de $PATHlike /bin:/usr/bin:(à direita :), onde falharia em listar os arquivos executáveis ​​no diretório atual.
Stéphane Chazelas

3

A lista de comandos consiste em dois conjuntos:

  1. Os comandos embutidos no shell
  2. Os comandos no seu PATH

Você não pode alterar embutidos, mas pode impedir que o shell use um embutido especificando o nome do caminho completo como /bin/echo.

Quanto aos comandos no seu PATH, você pode mudar isso. PATHé uma lista de diretórios separados por dois pontos para procurar comandos. O primeiro arquivo correspondente encontrado "vence".

export PATH=~/bin:${PATH}

(Essa sintaxe não funciona para cshshells derivadas, mas todas as outras que eu conheço).

Isso é exportado PATHcom ~/bina primeira entrada seguida pelo restante das PATHentradas existentes . Então agora o seu shell irá verificar directory calledbin in your home directory for a command *first* before checking the standardPATH` o sistema estabelecido. Você pode facilmente verificar o novo diretório por último, usando:

export PATH=${PATH}:~/bin

Para tornar a PATHpersistência para logins futuros, adicione-a a um .profileou outro arquivo shell rc.



1

Se você pressionar a tecla Tab duas vezes e, em seguida, y, você obterá a lista de todos os comandos disponíveis no seu shell atual. Para a segunda pergunta, acho que você deve usar o alias: alias do shell .


em relação ao alias, essa é uma maneira infalível de sobrescrever e sobrescrever (por "desalinhamento") um comando quando ele é chamado em qualquer lugar do sistema (por exemplo, a partir de um shell script)?
themirror

1
Qual shell você usa? Não consigo obter a guia dupla para listar todos os comandos no meu bash.
terdon

Eu uso o bash no Ubuntu 13.04. Há também um comando chamado compgen que pode ser usado para obter a lista de todos os comandos disponíveis no bash.
coffemug

@terdon Você tem a conclusão do bash instalada?
coffemug

1
set show-tudo se-ambígua off
coffemug
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.