
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 view
comando 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 (
~/.bashrc
para 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 (
cd
altera o diretório atual,set
altera opções e parâmetros posicionais,export
altera 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
PATH
variá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 alias
integrado 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 set
builtin lista funções com suas definições e também variáveis. No bash, ksh ou zsh, typeset -f
lista 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 function
para listar comandos de um tipo específico. Você pode passar uma string adicional para compgen
listar 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 PATH
variável de ambiente não contém ~/dir-for-wat-command
, compgen -c
nã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, usandofesta:
( # 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.