Não há uma borda nítida entre o shell e os aplicativos.
Alguns dos comandos que você executa em um shell precisam ser construídos no shell, porque eles agem no processo do shell. Por exemplo, cd
altera o diretório de trabalho do shell, e isso não pode ser feito de fora, então cd
tem que ser um comando interno. Mas este é um detalhe de implementação. Um usuário casual não precisa saber que existem razões técnicas que obrigam cd
a ser um comando interno.
Em outro extremo, existem grandes aplicativos feitos por diferentes autores, como o Firefox ou o Emacs. Estes não serão construídos em qualquer shell porque são muito grandes. Mas isso não é uma impossibilidade fundamental, apenas uma questão de design. Por exemplo, existem shells que possuem builtins para fazer aplicações simples de GUI.
No meio, existem comandos que podem ir em qualquer direção. Por exemplo, o comando echo
não precisa ser construído no shell, mas quase todos os shell foram integrados porque são muito pequenos e usados com frequência, portanto, devem ser eficientes. Outro exemplo é kill
, que para uso casual pode ser um comando externo, mas ter um built-in tem várias vantagens: você pode invocá-lo mesmo que tenha atingido um limite no número de processos, e você pode dar um número de trabalho do shell ( kill %2
) em vez de um ID de processo. Até mesmo a construção [ … ]
(que também pode ser escrita test
) poderia, em princípio, ser um comando externo, mas é construída em shells pelo mesmo motivo que echo
.
Se você está curioso, pode verificar o status de um determinado comando com o comando type
. Por exemplo, na minha configuração:
% type while type setenv cp emacs
while is a reserved word
type is a shell builtin
setenv is a shell function
cp is an alias for cp -i
emacs is /usr/bin/emacs
Palavras reservadas, como while
e then
, fazem parte da sintaxe do shell. Builtins são comandos que são construídos no shell e não requerem um executável externo. Funções são comandos compostos que são definidos e nomeados pelo usuário e podem ser chamados pelo nome. Os aliases são nomes abreviados definidos pelo usuário para comandos mais longos (comportando-se de maneira diferente das funções). O último exemplo é um comando externo.
¹ por 21.07.2011 / 02:35