Nos seus comentários, você parece estar confuso sobre exatamente o que é um shell . O kernel é responsável por gerenciar o sistema. É a parte que realmente carrega e executa programas, acessa arquivos, aloca memória, etc. Mas o kernel não possui interface com o usuário; você só pode se comunicar com ele usando outro programa como intermediário.
Um shell é um programa que imprime um prompt, lê uma linha de entrada sua e depois a interpreta como um ou mais comandos para manipular arquivos ou executar outros programas. Antes da invenção da GUI, o shell era a principal interface do usuário de um sistema operacional. No MS-DOS, o shell foi chamado command.com
e poucas pessoas tentaram usar outro. No Unix, no entanto, há muito tempo que vários usuários podem escolher.
Eles podem ser divididos em 3 tipos. Os shells compatíveis com Bourne usam a sintaxe derivada do shell Bourne original . Os shells C usam a sintaxe do shell C original . Depois, existem shells não tradicionais que inventam sua própria sintaxe ou emprestam uma de alguma linguagem de programação e geralmente são muito menos populares que os dois primeiros tipos.
Um comando interno é simplesmente um comando que o shell executa sozinho, em vez de interpretá-lo como uma solicitação para carregar e executar outro programa. Isso tem dois efeitos principais. Primeiro, geralmente é mais rápido, porque carregar e executar um programa leva tempo. Obviamente, quanto mais tempo o comando leva para executar, menos significativo é o tempo de carregamento comparado ao tempo geral de execução (porque o tempo de carregamento é razoavelmente constante).
Em segundo lugar, um comando interno pode afetar o estado interno do shell. É por isso que comandos como cd
devem ser integrados, porque um programa externo não pode alterar o diretório atual do shell. Outros comandos, como echo
, podem ser integrados para eficiência, mas não há razão intrínseca para que eles não possam ser comandos externos.
Quais comandos estão embutidos dependem do shell que você está usando. Você terá que consultar sua documentação para obter uma lista (por exemplo, bash
os comandos internos estão listados no Capítulo 4 deste manual ). O type
comando pode dizer se um comando está embutido (se o seu shell for compatível com POSIX), porque o POSIX exige que type
seja embutido. Se which
não estiver embutido no seu shell, provavelmente não saberá sobre os embutidos do seu shell, mas apenas procurará programas externos.
Existem três níveis de utilitários embutidos:
Alguns utilitários são realmente parte do shell como uma linguagem de programação, mesmo que não sejam palavras reservadas . Eles são utilitários de controle de fluxo (
.
,:
,break
,continue
,return
,trap
,exit
,exec
,eval
), utilitários de parâmetros relacionados com o (set
,unset
,shift
,export
,readonly
,local
¹,typeset
¹), utilitários de alias (alias
m²,unalias
²) etimes
³. Esses embutidos especiais recebem tratamento especial:foo=bar utility
tem um significado diferente: é uma atribuição de parâmetro comum (ou seja, equivalente afoo=bar; utility
), em vez de atribuir ao ambiente apenas pela duração do utilitário.Alguns utilitários precisam ser implementados dentro do shell porque eles agem nas configurações internas do shell. Isso inclui:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.echo
,printf
,test
,true
,false
.Os shells avançados, como bash , ksh e zsh, geralmente têm mais recursos internos, geralmente para implementar recursos não padrão (geralmente para interação). O manual de cada shell informará quais comandos estão embutidos, embora alguns shells ( zsh , pelo menos) suportem módulos carregáveis dinamicamente que podem fornecer mais embutidos.
¹ Desconhecido para POSIX, mas especial no ksh e em vários outros shells.
² Comum no POSIX, mas especial no ksh e em várias outras conchas.
³ In
ksh
,times
é um invólucro em torno datime
palavra-chave: é um alias para{ { time;} 2>&1;}
. Observe que o POSIX permitetime
ser um utilitário externo com análise comum ou uma palavra-chave que se aplica a todo um pipeline (que está em ksh, bash em zsh).fonte
while IFS= read -r line
?read
não é um componente especial, portanto,IFS=read
define a variável apenas pela duração do comando.Um builtin é um comando fornecido pelo shell, e não por um programa externo. Aqui estão as listas
bash
dos buildins (eles também estão listados na página do manual do bash) ezsh
dos buildins .ksh
fornece uma lista executandobuiltin
.Para saber se um comando específico é interno, você pode executar
type command
. Tentetype for
etype ls
veja isso.fonte
type
parece fazer o truque; obrigado por isso ... mas ainda me pergunto o que "fornecido pelo shell" significa ... Talvez eu precise entender melhor como o shell se relaciona com o kernel .... mas não às 2 da manhã .. Eu irei Voltar para este amanhãCada distro e shell possui uma coleção diferente de comandos versus funções internas do shell. Geralmente, a ideia é que os shells incorporem as funções mais comuns e simples para economizar tempo, velocidade e integrar a vontade com o restante do conjunto de recursos. A sobrecarga é muito menor, pois não precisa iniciar outro processo do sistema. No entanto, é possível misturar e combinar. Você pode executar um shell que possui um buildin para alguma coisa, mas também possui esse comando no seu sistema. Normalmente, o built-in teria prioridade, mas você poderia controlar isso.
Você pode descobrir facilmente se um comando específico é incorporado ou não executando
type mycommand
. A maioria das páginas de manual do shell também possui uma lista de seus componentes internos.Editar: use
type
para descobrir se um comando é interno e, se não,which
para saber de onde será executado.fonte
=>"/bin/echo" and
tipo de eco echo=>"echo is a shell builtin", but 'which dd
=> "/ bin / dd" etype dd
=> "dd é / bin / dd" ... então, estou meio lá ....type
é o melhor indicador do que está sendo executado, mas você percebe queecho
ambos são internos e há um aplicativo com esse nome. Se o seu shell não tivesse um sistema interno, ele seria executado.which
não é necessariamente um comando interno e, se não for, ele não saberá sobre os recursos internos do shell. O POSIX exige quetype
seja um comando interno, para que ele sempre saiba sobre os internos.which
atype
ou algum conjunto de opções por exemploalias which='type -path'
- esta poderia ser a fonte de confusão.which
seja substituído portype
. Eu usei o que, uma e outra vez, sem sabertype
e fiquei muito surpreso em saber , issowhich
é certo, se decidir entre os programas.