Liste todos os comandos que um shell conhece

Liste todos os comandos que um shell conhece

O que posso digitar no meu shell (que é bash) que listará todos os comandos reconhecidos?

Além disso, isso difere de acordo com o shell? Ou todos os shells possuem apenas um "diretório" de comandos que reconhecem?

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

Responder1

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.

Responder2

Um shell conhece quatro tipos de comandos.

  • Aliases: 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 com um nome. Assim como os aliases, eles são definidos no arquivo de inicialização do shell.
  • Builtins: o shell vem com um pequeno número de comandos integrados. 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 shells oferece basicamente os mesmos recursos integrados, mas cada shell possui algumas extensões para o conjunto básico.
  • Comandos externos: são independentes do shell. Como outros programas, o shell executa programas externos procurando-os nocaminho de pesquisa executável. A PATHvariável de ambiente contém uma lista de diretórios separados por dois pontos para pesquisar programas.

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

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

Você pode listar aliases executando o aliasintegrado sem nenhum 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 setbuiltin lista funções com suas definições e também 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 com 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 string adicional para compgenlistar apenas os comandos que começam com esse prefixo.

No zsh, você pode listar os comandos atualmente disponíveis de um determinado tipo com echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}e echo ${(k)commands}(esse último lista apenas 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 extremo no Bash: comandos hash.

Manual de referência do Bashdiz:

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

Tentar:

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 mostra wat, mas você pode executar wat.

Se você quiser ocultar um comando existente,definir um alias ou uma função.

¹ Exceção: alguns recursos internos (chamadosrecursos especiais) não pode ser obscurecido por uma função - bash e zsh não estão em conformidade com POSIX nesse ponto em seu modo padrão.

Responder3

Tente isso, usando:

(   # usage of a sub processus: the modificaion of PATH variable is local in ( )
    PATH+=:EOF # little hack to list last PATH dir
    printf '%s\n' ${PATH//:/\/* }
)

Responder4

Se você pressionar a tecla tab duas vezes e depois y, você obterá a lista de todos os comandos disponíveis em seu shell atual. Para a segunda pergunta, acho que você deveria usar o alias:apelido de shell.

informação relacionada