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 view
comando para substituir o existente no meu sistema Ubuntu, que parece apenas carregar vim
.
Respostas:
Você pode usar
compgen
PARA SUA INFORMAÇÃO:
fonte
compgen -c
incluirá coisas como{
ouwhile
que não são comandos estritamente falando.Um shell conhece quatro tipos de comandos.
~/.bashrc
para bash).cd
altera o diretório atual,set
altera opções e parâmetros posicionais,export
altera o ambiente, ...). A maioria dos shell oferece basicamente os mesmos recursos internos, mas cada shell possui algumas extensões para o conjunto básico.PATH
variá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
alias
built-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
set
built-in lista funções com suas definições e 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 tipocompgen -c
. Você pode usarcompgen -A alias
,compgen -A builtin
compgen -A function
para listar comandos de um tipo específico. Você pode passar uma sequência adicionalcompgen
para 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}
eecho ${(k)commands}
(apenas essa última lista os comandos externos).O seguinte snippet independente de shell lista todos os programas externos disponíveis:
Há um caso de borda no Bash: comandos de hash.
O Manual de Referência do Bash diz:
Experimentar:
A
PATH
variável de ambiente não contém~/dir-for-wat-command
,compgen -c
não aparecewat
, mas você pode executarwat
.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.
fonte
$PATH
like/bin:/usr/bin:
(à direita:
), onde falharia em listar os arquivos executáveis no diretório atual.A lista de comandos consiste em dois conjuntos:
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".(Essa sintaxe não funciona para
csh
shells derivadas, mas todas as outras que eu conheço).Isso é exportado
PATH
com~/bin
a primeira entrada seguida pelo restante dasPATH
entradas existentes . Então agora o seu shell irá verificardirectory called
binin your home directory for a command *first* before checking the standard
PATH` o sistema estabelecido. Você pode facilmente verificar o novo diretório por último, usando:Para tornar a
PATH
persistência para logins futuros, adicione-a a um.profile
ou outro arquivo shell rc.fonte
Tente isso, usando o bash :
fonte
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 .
fonte