Qual é a diferença entre um comando interno e outro que não é?

70

Existe alguma diferença intrínseca entre um comando embutido e outro comando que pode nominalmente fazer a mesma coisa?

por exemplo. Os builtins recebem tratamento "especial"? ... há menos sobrecarga executá-los? .. ou eles são simplesmente "embutidos"; como o painel do seu carro?

... e há uma lista definitiva (atual) desses builtins?

    
por Peter.O 16.04.2011 / 17:58

4 respostas

83

De 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 tem interface de 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 e o 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 era chamado de command.com e poucas pessoas tentaram usar um diferente. No Unix, no entanto, há muito tempo há múltiplos shells que os 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. C shells usam a sintaxe do shell C original. Então existem shells não tradicionais que inventam sua própria sintaxe, ou emprestam uma de alguma linguagem de programação, e são geralmente muito menos populares que os dois primeiros tipos.

Um comando interno é simplesmente um comando que o shell executa em si, em vez de interpretá-lo como um pedido para carregar e executar algum outro programa. Isso tem dois efeitos principais. Primeiro, geralmente é mais rápido, porque carregar e executar um programa leva tempo. Naturalmente, quanto mais tempo o comando demora para ser executado, menos significativo o tempo de carregamento é comparado ao tempo de execução geral (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 incorporados para eficiência, mas não há razão intrínseca para que eles não possam ser comandos externos.

Quais comandos embutidos dependem do shell que você está usando. Você terá que consultar sua documentação para obter uma lista (por exemplo, os comandos internos de bash estão listados em Capítulo 4 do seu manual ). O comando type pode dizer se um comando está embutido (se o seu shell é compatível com POSIX), porque o POSIX requer que type seja um built-in. Se which não é um built-in em seu shell, provavelmente ele não saberá sobre os built-ins do seu shell, mas apenas procurará por programas externos.

    
por 16.04.2011 / 19:29
36

Existem três níveis de utilitários incorporados:

  • Alguns utilitários são realmente parte do shell como uma linguagem de programação, mesmo que sejam não palavras reservadas . Eles são utilitários de fluxo de controle ( . , : , break , continue , return , trap , exit , exec , eval ), utilitários relacionados a parâmetros ( set , unset , shift , export , readonly , local ¹, typeset ¹), utilitários de alias ( alias ², unalias ²) e times ³. Estes built-ins especiais recebem tratamento especial:

    • Se você passar os argumentos errados para um built-in especial, o shell em si pode abortar, em vez de simplesmente pular para o próximo comando depois de exibir uma mensagem de erro.
    • A sintaxe de pré-atribuição foo=bar utility tem um significado diferente: é uma atribuição de parâmetro comum (ou seja, equivalente a foo=bar; utility ), em vez de ser atribuída ao ambiente apenas pela duração do utilitário.
  • Alguns utilitários precisam para serem implementados dentro do shell, porque eles agem nas configurações internas do shell. Isso inclui:

    • utilitários que agem no diretório atual do shell, como cd , dirs , pushd , popd ;
    • utilitários de controle de tarefas, como bg , disown , fg , jobs , wait ;
    • utilitários que lêem ou manipulam outros atributos do shell, como builtin , command , hash , read , type , ulimit , umask ;
    • utilitários relacionados a recursos interativos, quando estão presentes, como fc , history , bind .
  • Alguns utilitários são normalmente implementados como internos para o desempenho : echo , printf , test , true , false .

Conchas avançadas, como bash , ksh e zsh geralmente tem mais recursos internos, geralmente para implementar recursos não padrão (geralmente para interação). O manual de cada shell lhe dirá quais comandos estão embutidos, apesar de alguns shells ( zsh , pelo menos) suportam módulos carregáveis dinamicamente que podem fornecer mais recursos internos.

¹ Desconhecido para POSIX, mas especial em ksh e vários outros shells.
² Ordinário em POSIX, mas especial em ksh e vários outros shells.
³ Em ksh , times é um wrapper em torno do time palavra-chave: é um alias para { { time;} 2>&1;} . Observe que POSIX permite que time seja um utilitário externo com análise comum ou uma palavra-chave que se aplique a um pipeline inteiro (que está em ksh, bash em zsh).

    
por 16.04.2011 / 18:29
10

Um builtin é um comando fornecido pelo shell, e não por um programa externo. Aqui estão as listas para builtins de bash (eles também são listados na página man bash) e zsh 's builtins . ksh fornece uma lista executando builtin .

Para saber se um comando específico é incorporado, você pode executar type command . Experimente type for e type ls para ver isso.

    
por 16.04.2011 / 18:01
1

Cada distro e shell tem uma coleção diferente de comandos versus funções internas do shell. Geralmente, a ideia é que os shells criem as funções mais comuns e simples para economizar tempo, velocidade e integrar a vontade com o restante de seu 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 tenha um buildin para algo, mas tenha esse comando em seu sistema também. Normalmente, o builtin teria prioridade, mas você poderia controlar isso.

Você pode descobrir facilmente se um comando específico é interno ou não executando type mycommand . A maioria das páginas de manual do shell também possui uma lista de suas builtins.

Editar: Use type para descobrir se um comando é embutido e se não é which para saber de onde ele será executado.

    
por 16.04.2011 / 18:02