Um colega de trabalho perguntou recentemente "O que é man
"? Depois de ser informado de que nem todas as coisas acessíveis a partir do Bash CLI são comandos , fiquei cauteloso ao chamar man
um comando.
man man
apenas chama de interface:
NAME
man - an interface to the on-line reference manuals
man
tem um executável:
$ which man
/usr/bin/man
$ file /usr/bin/man
/usr/bin/man: ELF 64-bit LSB shared object
Então é man
um programa, porque tem um executável? Que outros substantivos poderiam man
ser? Que substantivo seria para descrevê-lo? Realmente, estou interessado no caso geral de como eu poderia determinar o que é um arbitrário thing on the cli
, man
é apenas um exemplo.
Por falar nisso, qual é a palavra para todas as coisas que se pode usar no Bash CLI? Uma palavra que engloba comandos, aliases, chamadas de sistema, etc?
Em termos POSIX, qualquer coisa que possa pedir ao shell para fazer algo é um comando :
Então
é um comando, como é (tecnicamente)
man
também é um utilitário :(A exclusão não é significativa aqui; é mencionada porque utilitários integrados especiais têm propriedades específicas .)
Para descobrir o que é um determinado comando, use
type
. Isto lhe dirá se está embutido, ou um programa noPATH
(e onde), ou um alias etc. (ou desconhecido).Observe que as chamadas do sistema não podem ser usadas como comandos do shell.
Veja também São comandos ou utilitários? e Qual é a diferença entre um comando interno e um que não é?
A partir do nível mais baixo:
Chamadas do sistema
As chamadas do sistema são a maneira como as tarefas do usuário (devem) usar para solicitar algum serviço do kernel e executar no modo de kernel privilegiado.
Digamos, por exemplo, C é sua linguagem de programação e você quer que sua tarefa mude seu diretório atual, você precisará inserir uma instrução chdir() em seu programa.
É claro que esses procedimentos não são imediatamente acessíveis a partir da linha de comando. vg digitar chdir na linha de comando não chamará a chamada de sistema chdir.
A lista de todas as chamadas de sistema disponíveis é obviamente dependente do kernel e a única fonte confiável é certamente o
include/linux/syscalls.h
arquivo de cabeçalho de sua distribuição de fonte do kernel.Instruções
Uma CLI é uma interface para a tarefa que você está executando. Tudo o que você digita é chamado de instrução simplesmente porque deveria instruir a tarefa a realizar alguma ação.
Comandos
O que você digita passará primeiro por um interpretador que realizará alguma análise léxica nos tokens digitados e, no caso particular de um shell, poderá reconhecer o nome de um comando (entendido como não uma atribuição de variável) e decidir incidentalmente que precisa recorrer a outro programa para atender ao seu pedido. Ele então bifurcará um processo filho que executará o binário desse outro programa.
Mas existem casos especiais para os quais a tarefa pode achar mais fácil satisfazer o pedido sem recorrer a programas externos (cálculo trivial por exemplo) ou, mais importante, deve executar o seu pedido internamente.
Comandos integrados
Voltando à nossa vontade inicial de mudar o diretório ativo, o usuário emitirá o conhecido comando shell
cd
. O que o usuário realmente quer é que o diretório atual de seu shell seja alterado. E como a chamada do sistema chdir altera apenas o diretório de trabalho atual do chamador, o shell simplesmente não pode bifurcar outro processo que não alteraria nada para seu pai. O shell deve executar a chamada de sistema chdir internamente.Os comandos internos do shell são listados em todas as
yourshellname
páginas man.Apelido
Os aliases nada mais são do que sinônimos que qualquer usuário pode configurar e que serão traduzidos pelo interpretador de linha de comando na string desejada (supostamente para representar qualquer instrução legal para o shell).
A lista de todos os aliases atualmente ativos pode ser obtida graças ao comando interno do shell
alias
.Eu tenho um pequeno shellscript, que pode me ajudar a identificar um comando: que tipo de comando é e se instalado por meio de um pacote de programa, qual pacote. Talvez use o
what-about
nomeÀs vezes, há duas alternativas, por exemplo, para
echo
, um programa compilado separado e um comando interno do shell. O shell embutido terá prioridade e será usado, a menos que você use o caminho completo do programa separado,Às vezes um comando está vinculado ao programa, que pode estar oculto, por exemplo, a versão
rename
que eu uso,Eu tenho um alias para
rm
para evitar erros, e o alias tem prioridade sobre o programa emPATH
. Você pode prefixar com barra invertida,\rm
para pular o alias e executar o programa diretamente. (Lembre-se de que o alias se aplica apenas ao usuário específico, e não asudo
outros usuários, a menos que tenham definido um alias semelhante.)